
    i#                        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j                  ej                  d	          ej                  d
k\  r=ej                  ej                  d          ej                  ej                  d          nej                  ej                  d          dej                  cxk  rdk  r!n nej                  ej                  d          ej                  dk\  rej                  ej                  d           eej                   ej"                  z         ZeD  ch c]  } ej&                  |     c} Z eej*                        Z eej.                        Zej2                  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jD                   G d d             Z#ded   dddee   fdZ$ejD                   G d d              Z%ejD                   G d! d"             Z&ded   deee'f   fd#Z(yc c} w )$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_INTERRUPTinstsr   returnc                 F    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       Y/var/www/html/engine/venv/lib/python3.12/site-packages/torch/_dynamo/bytecode_analysis.pyget_indexofr   3   s?    
 GU# 47""" N    instructionsc                     t               t               dt        ddf fd d       t        j                  dk\  rt              }t               D ]  \  }}|v s|j                  st        j                  ||j                  j                           }|t        |      k  sJ t        j                  ||j                  j                           dz
  }|dk\  sJ ||   |cxk  r	||   k  sJ  J  ||      |j                  _
         ||      |j                  _         t               D cg c]  \  }}|v s| c}}S c c}}w )zDead code eliminationstartr   Nc                 Z   t        | t                    D ]  }|v r y j                  |       |   }|j                  r |j                  j                            |j
                  t        v r#|j                  J  |j                            |j
                  t        v s y  y N)rangelenaddexn_tab_entrytargetopcodeJUMP_OPCODESTERMINAL_OPCODES)r"   r   r   find_live_coder   r    	live_codes      r   r-   z(remove_dead_code.<locals>.find_live_codeD   s    uc,/0 	AI~MM!?D!!wt'9'9'@'@AB{{l*{{...wt{{34{{..	r   r   r   r   )r   setintsysversion_infosortedr   r(   bisectbisect_leftr"   r&   bisect_rightend)	r    live_idxr   r   	start_idxend_idxr-   r   r.   s	   `     @@@r   remove_dead_coder;   ?   sg   ,'GIc d   1 7")$ . 	IGAtI~$"4"4"..gd&8&8&>&>?	 !3x=000 '''$:L:L:P:P2QRUVV  !|#|	*aD8G3DDDDDD+78K+L""()5hw6G)H""&	I  !*, 7JWQ1	>DJJJs   <E	Ec                     t        | | dd       D ch c]-  \  }}|j                  dk(  r|j                  |u rt        |      / }}}| D cg c]  }t        |      |vs| c}S c c}}w c c}w )z'Eliminate jumps to the next instructionr   Nr   )zipopnamer)   id)r    abpointless_jumpsr   s        r   remove_pointless_jumpsrC   m   sv     l12&67Aq88&188q= 	1O 
 *MTRX_-LDMM
 Ns   2A&A,A,c                 4    ddfd}| D ]
  } ||        y)zEEnsure every instruction has line number set in case some are removedNc                 D    | j                   r| j                   | _         y r$   starts_liner   cur_line_nos    r   populate_line_numz.propagate_line_nums.<locals>.populate_line_num{   s    **K&r   r   r   r   N )r    rJ   r   rI   s      @r   propagate_line_numsrM   w   s&    K'   $ r   c                 4    ddfd}| D ]
  } ||        y)z;Remove extra starts line properties before packing bytecodeNc                 f    | j                   y | j                   k(  rd | _         y | j                   y r$   rF   rH   s    r   remove_line_numz/remove_extra_line_nums.<locals>.remove_line_num   s3    #,#D**Kr   rK   rL   )r    rP   r   rI   s      @r   remove_extra_line_numsrQ      s(     K+  r   c                   >    e Zd ZU ee   ed<   ee   ed<   ee   ed<   y)ReadsWritesreadswritesvisitedN)__name__
__module____qualname__r/   r   __annotations__rL   r   r   rS   rS      s    s8OHXr   rS   instructionc                 0    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y | j                   j                  |       t        |t                    D ]Z  }|   }|j                  t
        v s|j                  t        v rd|j                  v sd|j                  v r>|j                  j                  vr| j                  j                  |j                         n\d|j                  v r&| j                  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 s[ y  y )NLOADDELETESTORE	MAKE_CELLz
unhandled )rV   r'   r%   r&   r*   HASLOCALHASFREEr>   argvalrU   rT   NotImplementedErrorr(   r)   r+   r,   )	r]   r"   r   r   r   r    maymustwalks	       r   ri   zlivevars_analysis.<locals>.walk   sI   EMM!% uc,/0 	A?D{{h&$++*@T[[(H,C{{$++54+LL$$T[[1[[K/-
4;;-.HII!!S'$"4"4";";<={{l*{{...S'$++./{{..'	r   )r   rS   r/   r0   rT   )r    r[   r   rg   rh   ri   s   ` @@@@r   livevars_analysisrj      sz     ,'GsuceSU+D
ceSUCE
*CK    4 	w{#$::		!!r   c                       e Zd ZU dZeed<   y)FixedPointBoxTvalueN)rW   rX   rY   rm   boolrZ   rL   r   r   rl   rl      s    E4r   rl   c                   l    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
y)	StackSizelowhighfixed_pointr   Nc                 B    d| _         d| _        d| j                  _        y )Nr   F)rq   rr   rs   rm   )selfs    r   zerozStackSize.zero   s    	!&r   othernc                 .   | j                   | j                  f}t        | j                   |j                   |z         | _         t        | j                  |j                  |z         | _        | j                   | j                  f|k7  rd| j                  _        y y NFrq   rr   minmaxrs   rm   )ru   rw   rx   priors       r   	offset_ofzStackSize.offset_of   sp    499%txxQ/		5::>2	HHdii E)%*D" *r   depthc                     | j                   | j                  f}t        | j                   |      | _         t        | j                  |      | _        | j                   | j                  f|k7  rd| j                  _        y y rz   r{   )ru   r   r~   s      r   exn_tab_jumpzStackSize.exn_tab_jump   s`    499%txx'		5)	HHdii E)%*D" *r   )r   N)rW   rX   rY   r   r0   floatrZ   rl   rv   r   r   rL   r   r   rp   rp      sX    	sEz	
U

'
+{ +s +t ++# +$ +r   rp   c           
      N   | sJ t               }| D ci c]"  }|t        t        d      t        d      |      $ }}|| d      j                          t	        d      D ]e  }|j
                  r nVd|_        t        | | dd  d gz         D ]5  \  }}||   }|j                  t        vrC|
J d|        t        |j                  |j                  d	      }||   j                  ||       |j                  t        v rU|j                  
J d
|        ||j                     j                  |t        |j                  |j                  d	             |j                  s|j                  j                  t!        |j                  j"                        z   dz   }||j                  j                     j%                  |       8 h t'        d |j)                         D              }	t+        d |j)                         D              }
|j
                  sJ d       |	dk\  sJ |
S c c}w )Ninfz-infr   d   Tr   zmissing next inst: F)jumpzmissing target: c              3   4   K   | ]  }|j                     y wr$   )rq   .0xs     r   	<genexpr>z%stacksize_analysis.<locals>.<genexpr>  s     2aee2   c              3   4   K   | ]  }|j                     y wr$   )rr   r   s     r   r   z%stacksize_analysis.<locals>.<genexpr>  s     4!qvv4r   zfailed to reach fixed point)rl   rp   r   rv   r%   rm   r=   r*   r,   stack_effectargr   r+   r)   r(   r   r0   lastir   r|   valuesr}   )r    rs   r   stack_sizes_	next_inst
stack_sizeeffr   rq   rr   s              r   stacksize_analysisr      s   </K ! 	ieeFm[AAK  Q %%'3Z K "<ab1ATF1JK 	KOD)$T*J{{"22 ,J0CD6.JJ,"4;;uEI&00SA{{l*{{.I2B4&0II.DKK(22T[[$(( N !! **003t7I7I7O7O3PPSTTD..556CCEJ	KK, 2[//12
2C4{11344D;;;!8O8KCs   'H"))__doc__r4   dataclassesdisr1   typingr   r   r   bytecode_transformationr   opmapr,   r'   r2   r/   hasjrelhasjabsr+   r>   JUMP_OPNAMEShaslocalrc   hasfreerd   r   listdictr0   r   r;   rC   rM   rQ   	dataclassrS   rj   rl   rp   r   r   )r*   s   0r   <module>r      s     
 
 , ,  5 IInIInIIo    SYYy) *w?34>23?34
c((>23w#?@A3;;,-1=>v

6">s||
ckk
	tM* 	tM34F/G 	+K4#6 +K4;N +K\Nm)< NmAT N d=&9  d  m)<  $   ""}%""4A""X""J    + + +2$T-%8 $U3:=N $o ?s   I