
    ^jC(                        d Z ddlZddlZddlZddlZddlZddl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'z  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   )InstructionRETURN_VALUEJUMP_FORWARDRAISE_VARARGSRERAISE      JUMP_BACKWARDJUMP_ABSOLUTE)r      )r      RETURN_CONST)r      JUMP_BACKWARD_NO_INTERRUPTinstsr   returnc                 `    i }t        |       D ]  \  }}||v rt        d| d      |||<    |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.
    zduplicate instruction at index z in instruction list)	enumerateAssertionError)r   indexofiinsts       j/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/_dynamo/bytecode_analysis.pyget_indexofr   5   sT     GU# 47? 1!4HI   N    instructionsc           
          t               t               dt        ddf fd d       t        j                  dk\  rt              }t               D ]  \  }}|v s|j                  st        j                  ||j                  j                           }|t        |      k\  rt        d      t        j                  ||j                  j                           dz
  }|dk  rt        d	      ||   |cxk  r||   k  sn t        d
| d||    d||    d       ||      |j                  _
         ||      |j                  _         t               D cg c]  \  }}|v s| c}}S c c}}w )zDead code eliminationstartr   Nc                    t        | t                    D ]  }|v r y j                  |       |   }|j                  r |j                  j                            |j
                  t        v r:|j                  t        d|j                   d       |j                            |j
                  t        v s y  y )Njump instruction  has no target)
rangelenaddexn_tab_entrytargetopcodeJUMP_OPCODESr   opnameTERMINAL_OPCODES)r"   r   r   find_live_coder   r    	live_codes      r   r/   z(remove_dead_code.<locals>.find_live_codeJ   s    uc,/0 	AI~MM!?D!!wt'9'9'@'@AB{{l*;;&(+DKK=G  wt{{34{{..	r   r   r   z9no live instruction found at or after exn_tab_entry startr   z8no live instruction found at or before exn_tab_entry endzinstruction z not within live range [z, ])r   setintsysversion_infosortedr   r)   bisectbisect_leftr"   r'   r   bisect_rightend)	r    live_idxr   r   	start_idxend_idxr/   r   r0   s	   `     @@@r   remove_dead_coder>   E   s   ,'GIc d  " 1 7")$ . 	IGAtI~$"4"4"..gd&8&8&>&>?	 H-(S 
 '''$:L:L:P:P2QRUVV  Q;(R  !+qEHW4EE(&qc *$Y/08G3D2EQH  ,88K+L""()5hw6G)H""&1	I4 !*, 7JWQ1	>DJJJs   'E<4E<c                     t        j                  |       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   )	itertoolspairwiser-   r*   id)r    abpointless_jumpsr   s        r   remove_pointless_jumpsrF      ss     &&|4Aq88&188q= 	1O 
 *MTRX_-LDMM
 Ns   2A,A2%A2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 N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    rN   r   rM   s      @r   propagate_line_numsrQ      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 rI   rJ   rL   s    r   remove_line_numz/remove_extra_line_nums.<locals>.remove_line_num   s3    #,#D**Kr   rO   rP   )r    rT   r   rM   s      @r   remove_extra_line_numsrU      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__r2   r   __annotations__rP   r   r   rW   rW      s    s8OHXr   rW   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                 n   || j                   v ry | j                   j                  |       t        |t                    D ]q  }|   }|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                  t        d|j                   d       |j                            } |j                  t         v sr y  y )NLOADDELETESTORE	MAKE_CELLz
unhandled r$   r%   )rZ   r(   r&   r'   r+   HASLOCALHASFREEr-   argvalrY   rX   NotImplementedErrorr)   r*   r,   r   r.   )	ra   r"   r   r   r   r    maymustwalks	       r   rm   zlivevars_analysis.<locals>.walk   sb   EMM!% uc,/0 	A?D{{h&$++*@T[[(H,C{{$++54+LL$$T[[1[[K/-
4;;-.HII!!S'$"4"4";";<={{l*;;&(+DKK=G  S'$++./{{..-	r   )r   rW   r2   r3   rX   )r    r_   r   rk   rl   rm   s   ` @@@@r   livevars_analysisrn      sz     ,'GsuceSU+D
ceSUCE
*CK    : 	w{#$::		!!r   c                       e Zd ZU dZeed<   y)FixedPointBoxTvalueN)r[   r\   r]   rq   boolr^   rP   r   r   rp   rp      s    E4r   rp   c                   d    e Zd ZU eez  ed<   eez  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)ru   rv   rw   rq   )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ru   rv   minmaxrw   rq   )ry   r{   r|   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 r~   r   )ry   r   r   s      r   exn_tab_jumpzStackSize.exn_tab_jump   s`    499%txx'		5)	HHdii E)%*D" *r   )r   N)
r[   r\   r]   r3   floatr^   rp   rz   r   r   rP   r   r   rt   rt      sN    	u
+'
+{ +s +t ++# +$ +r   rt   c           
         | st        d      t               }| D ci c]"  }|t        t        d      t        d      |      $ }}|| d      j	                          t        d      D ]m  }|j                  r n^d|_        t        | | dd  d gz         D ]=  \  }}||   }|j                  t        vrG|t        d|       t        |j                  |j                  d	
      }||   j                  ||       |j                  t        v rY|j                  t        d|       ||j                     j                  |t        |j                  |j                  d
             |j                  s|j                  j                   t#        |j                  j$                        z   dz   }||j                  j                     j'                  |       @ p t)        d |j+                         D              }	t-        d |j+                         D              }
|j                  st        d      |	dk  rt        d|	       |
S c c}w )Nz#instructions list must not be emptyinfz-infr   d   Tr   zmissing next inst: F)jumpzmissing target: c              3   4   K   | ]  }|j                     y wrI   )ru   .0xs     r   	<genexpr>z%stacksize_analysis.<locals>.<genexpr>  s     2aee2   c              3   4   K   | ]  }|j                     y wrI   )rv   r   s     r   r   z%stacksize_analysis.<locals>.<genexpr>  s     4!qvv4r   zfailed to reach fixed pointz1stack size analysis produced negative low value: )r   rp   rt   r   rz   r&   rq   zipr+   r.   stack_effectargr   r,   r*   r)   r   r3   lastir   r   valuesr   )r    rw   r   stack_sizes_	next_inst
stack_sizeeffr   ru   rv   s              r   stacksize_analysisr      s1   BCC/K ! 	ieeFm[AAK  Q %%'3Z K "<ab1ATF1JK 	KOD)$T*J{{"22$(+>tf)EFF"4;;uEI&00SA{{l*;;&(+;D6)BCCDKK(22T[[$(( N !! **003t7I7I7O7O3PPSTTD..556CCEJ#	KK0 2[//12
2C4{11344D:;;
QwPQTPUVWWKKs   'I))__doc__r7   dataclassesdisr@   r4   typingr   r   bytecode_transformationr   opmapr.   r(   r5   r2   hasjrelhasjabsr,   r-   JUMP_OPNAMEShaslocalrg   hasfreerh   r   listdictr3   r   r>   rF   rQ   rU   	dataclassrW   rn   rp   rt   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  8K4#6 8K4;N 8KvNm)< NmAT N d=&9  d  m)<  $   %"}%%"4A%"X%"P    + + +2)T-%8 )S5[ )W ?s   !I