
    %Vji#                        d Z ddlZddlZddlZddlZddlmZmZmZ erddl	m
Z
 ej        d         ej        d         ej        d         hZe                    ej        d	                    ej        d
k    rAe                    ej        d                    e                    ej        d                    n e                    ej        d                    dej        cxk    rdk     r#n n e                    ej        d                    ej        dk    r e                    ej        d                     eej        ej        z             Zd eD             Z eej                  Z eej                  Zej        Zded         dedef         fdZded         ded         fdZded         ded         fdZded         ddfdZded         ddfdZ ej!         G d d                      Z"ded         dddee         fdZ#ej!         G d  d!                      Z$ej!         G d" d#                      Z%ded         deee&f         fd$Z'dS )%a  
This module provides utilities for analyzing and optimizing Python bytecode.
Key functionality includes:
- Dead code elimination
- Jump instruction optimization
- Stack size analysis and verification
- Live variable analysis
- Line number propagation and cleanup
- Exception table handling for Python 3.11+

The utilities in this module are used to analyze and transform bytecode
for better performance while maintaining correct semantics.
    N)AnyTYPE_CHECKINGUnion   )InstructionRETURN_VALUEJUMP_FORWARDRAISE_VARARGSRERAISE      JUMP_BACKWARDJUMP_ABSOLUTE)r      )r      RETURN_CONST)r      JUMP_BACKWARD_NO_INTERRUPTc                 2    h | ]}t           j        |         S  )disopname).0opcodes     Y/root/voice-cloning/.venv/lib/python3.11/site-packages/torch/_dynamo/bytecode_analysis.py	<setcomp>r   ,   s    >>>v
6">>>    instsr   returnc                 J    i }t          |           D ]\  }}||vsJ |||<   |S )z
    Get a mapping from instruction memory address to index in instruction list.
    Additionally checks that each instruction only appears once in the list.
    )	enumerate)r   indexofiinsts       r   get_indexofr&   3   sE    
 GU##  47""""Nr   instructionsc                     t                     t                      dt          ddf fd d           t          j        dk    rt                    }t                     D ]\  }}|v r|j        rt          j	        ||j        j
                           }|t          |          k     sJ t          j        ||j        j                           dz
  }|dk    sJ ||         |cxk    r||         k    sn J  ||                  |j        _
         ||                  |j        _        Ȉfdt                     D             S )	zDead code eliminationstartr    Nc                 P   t          | t                              D ]}|v r d S                     |           |         }|j        r |j        j                            |j        t          v r|j        J  |j                            |j        t          v r d S d S N)rangelenaddexn_tab_entrytargetr   JUMP_OPCODESTERMINAL_OPCODES)r)   r$   r%   find_live_coder#   r'   	live_codes      r   r3   z(remove_dead_code.<locals>.find_live_codeD   s    uc,//00 	 	AI~~MM!?D! Cwt'9'@ABBB{l**{...wt{3444{... /	 	r   r   r   r   c                 "    g | ]\  }}|v 	|S r   r   )r   r$   r%   r4   s      r   
<listcomp>z$remove_dead_code.<locals>.<listcomp>j   s"    JJJWQ1	>>D>>>r   )r&   setintsysversion_infosortedr"   r/   bisectbisect_leftr)   r-   bisect_rightend)	r'   live_idxr$   r%   	start_idxend_idxr3   r#   r4   s	   `     @@@r   remove_dead_coderC   ?   s   ,''GIc d          N1 7"")$$ .. 	I 	IGAtI~~$"4~".gd&8&>? 	 !3x==0000 ''$:L:P2QRRUVV  !||||	*aDDDD8G3DDDDDDD+78K+L"()5hw6G)H"&JJJJ	, 7 7JJJJr   c                 d    d t          | | dd                   D             fd| D             S )z'Eliminate jumps to the next instructionc                 Z    h | ](\  }}|j         d k    |j        |u t          |          )S )r   )r   r0   id)r   abs      r   r   z)remove_pointless_jumps.<locals>.<setcomp>o   sA       Aq8&&18q== 	1+8==r   r   Nc                 6    g | ]}t          |          v|S r   )rF   )r   r%   pointless_jumpss     r   r6   z*remove_pointless_jumps.<locals>.<listcomp>t   s)    MMMTRXX_-L-LD-L-L-Lr   )zip)r'   rJ   s    @r   remove_pointless_jumpsrL   m   sQ     l122&677  O
 NMMM\MMMMr   c                 8    ddfd}| D ]} ||           dS )zEEnsure every instruction has line number set in case some are removedNr%   r   r    c                 2    | j         r| j         | _         d S r+   starts_liner%   cur_line_nos    r   populate_line_numz.propagate_line_nums.<locals>.populate_line_num{   s$     	+*K&r   r%   r   r    Nr   )r'   rS   r%   rR   s      @r   propagate_line_numsrU   w   sU    K' ' ' ' ' '     $   r   c                 8    ddfd}| D ]} ||           dS )z;Remove extra starts line properties before packing bytecodeNr%   r   r    c                 P    | j         d S | j         k    r	d | _         d S | j         d S r+   rO   rQ   s    r   remove_line_numz/remove_extra_line_nums.<locals>.remove_line_num   s9    #F,,#D*KKKr   rT   r   )r'   rX   r%   rR   s      @r   remove_extra_line_numsrY      sV     K+ + + + + +    r   c                   R    e Zd ZU ee         ed<   ee         ed<   ee         ed<   dS )ReadsWritesreadswritesvisitedN)__name__
__module____qualname__r7   r   __annotations__r   r   r   r[   r[      s?         s8OOOHXr   r[   instructionc                 t    t                     t          t                      t                      t                                t          t                      t                      t                                dt          dt          dd f fd |                    j        j        z  S )Nstater)   r    c                    || j         v rd S | j                             |           t          |t                              D ]}|         }|j        t
          v s|j        t          v rd|j        v s	d|j        v r.|j        j	        vr| j
                            |j                   nLd|j        v r | j	                            |j                   n#|j        dk    rnt          d|j                   |j        r |j        j                            |j        t          v r"|j        J  |j                            } |j        t          v r d S d S )NLOADDELETESTORE	MAKE_CELLz
unhandled )r^   r.   r,   r-   r   HASLOCALHASFREEr   argvalr]   r\   NotImplementedErrorr/   r0   r1   r2   )	re   r)   r$   r%   r#   r'   maymustwalks	       r   rq   zlivevars_analysis.<locals>.walk   s   EM!!F%   uc,//00 	 	A?D{h&&$+*@*@T[((H,C,C{$+55444++L$$T[1111[K//-.H4;.H.HIII! >S'$"4";<==={l**{...S'$+.///{... /%	 	r   )r&   r[   r7   r8   r\   )r'   rc   r#   ro   rp   rq   s   ` @@@@r   livevars_analysisrr      s     ,''GsuuceeSUU++D
ceeSUUCEE
*
*CK            4 	Dw{#$$$:	!!r   c                       e Zd ZU dZeed<   dS )FixedPointBoxTvalueN)r_   r`   ra   ru   boolrb   r   r   r   rt   rt      s"         E4r   rt   c                   z    e Zd ZU eeef         ed<   eeef         ed<   eed<   ddZdd deddfd	Z	d
eddfdZ
dS )	StackSizelowhighfixed_pointr    Nc                 :    d| _         d| _        d| j        _        d S )Nr   F)ry   rz   r{   ru   )selfs    r   zerozStackSize.zero   s!    	!&r   othernc                     | j         | j        f}t          | j         |j         |z             | _         t          | j        |j        |z             | _        | j         | j        f|k    rd| j        _        d S d S NFry   rz   minmaxr{   ru   )r}   r   r   priors       r   	offset_ofzStackSize.offset_of   so    49%txQ//	5:>22	Hdi E))%*D""" *)r   depthc                     | j         | j        f}t          | j         |          | _         t          | j        |          | _        | j         | j        f|k    rd| j        _        d S d S r   r   )r}   r   r   s      r   exn_tab_jumpzStackSize.exn_tab_jump   sc    49%tx''	5))	Hdi E))%*D""" *)r   )r    N)r_   r`   ra   r   r8   floatrb   rt   r~   r   r   r   r   r   rx   rx      s         	sEz	
U

' ' ' '
+{ +s +t + + + ++# +$ + + + + + +r   rx   c           
        
 | sJ t                      

fd| D             }|| d                                                   t          d          D ]G}
j        r n<d
_        t	          | | dd          d gz             D ]\  }}||         }|j        t          vrG|J d|             t          |j        |j        d          }||         	                    ||           |j        t          v rO|j        J d	|             ||j                 	                    |t          |j        |j        d                     |j        rN|j        j        t          |j        j                  z   dz   }||j        j                                     |           It#          d
 |                                D                       }t'          d |                                D                       }	
j        s
J d            |dk    sJ |	S )Nc           	      h    i | ].}|t          t          d           t          d                    /S )infz-inf)rx   r   )r   r%   r{   s     r   
<dictcomp>z&stacksize_analysis.<locals>.<dictcomp>   sC        	ieeFmm[AA  r   r   d   Tr   zmissing next inst: F)jumpzmissing target: c              3   $   K   | ]}|j         V  d S r+   )ry   r   xs     r   	<genexpr>z%stacksize_analysis.<locals>.<genexpr>  s$      22ae222222r   c              3   $   K   | ]}|j         V  d S r+   )rz   r   s     r   r   z%stacksize_analysis.<locals>.<genexpr>  s$      44!qv444444r   zfailed to reach fixed point)rt   r~   r,   ru   rK   r   r2   stack_effectargr   r1   r0   r/   r   r8   lastir   r   valuesr   )r'   stack_sizes_r%   	next_inst
stack_sizeeffr   ry   rz   r{   s             @r   stacksize_analysisr      s[   <//K      K Q %%'''3ZZ K K 	E "<abb1ATF1JKK 	K 	KOD)$T*J{"222 ,,.JD.J.J,,,"4;uEEEI&00SAAA{l**{..0I40I0I...DK(22T[$( N N N   ! K *03t7I7O3P3PPSTTD.56CCEJJJ	K" 22[//11222
2
2C44{113344444D;;;;;!8888Kr   )(__doc__r<   dataclassesr   r9   typingr   r   r   bytecode_transformationr   opmapr2   r.   r:   r7   hasjrelhasjabsr1   JUMP_OPNAMEShaslocalrk   hasfreerl   r   listdictr8   r&   rC   rL   rU   rY   	dataclassr[   rr   rt   rx   r   r   r   r   r   <module>r      s         



 



 , , , , , , , , , ,  5 544444 InInIo    SYy) * * *w?3444>23333?3444
c(((((((((>2333w#?@AAAs3;,-->>>>>3s|
#ck

	tM* 	tM34F/G 	 	 	 	+K4#6 +K4;N +K +K +K +K\Nm)< NmAT N N N N d=&9  d        m)<     $        ""}%""4A""X"" "" "" ""J         + + + + + + + +2$T-%8 $U3:=N $ $ $ $ $ $r   