
    VhM!                        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 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
          ej                  dk\  r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j,                  Zd Zd Zd Zd Zd Zej8                   G d d             Zd Zej8                   G d d             Zej8                   G d d             Z 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UnionRETURN_VALUEJUMP_FORWARDRAISE_VARARGSRERAISE      JUMP_BACKWARDJUMP_ABSOLUTE)r
      RETURN_CONST)r
      JUMP_BACKWARD_NO_INTERRUPTc                 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)instsindexofiinsts       O/home/dcms/DCMS/lib/python3.12/site-packages/torch/_dynamo/bytecode_analysis.pyget_indexofr   0   s?    
 GU# 47""" N    c                     t               t                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 eliminationc                 >   t        | t                    D ]  }|v r y j                  |       |   }|j                  r |j                  j                            |j
                  t        v r |j                            |j
                  t        v s y  y N)rangelenaddexn_tab_entrytargetopcodeJUMP_OPCODESTERMINAL_OPCODES)startr   r   find_live_coder   instructions	live_codes      r   r'   z(remove_dead_code.<locals>.find_live_codeA   s    uc,/0 
	AI~MM!?D!!wt'9'9'@'@AB{{l*wt{{34{{..
	r   r   r	      )r   set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_coder6   <   sT   ,'GI 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   3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_jumpsr>   i   sv     l12&67Aq88&188q= 	1O 
 *MTRX_-LDMM
 Ns   2A&A,A,c                 2    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_numw   s    **K&r    )r(   rE   r   rD   s      @r   propagate_line_numsrG   s   s&    K'   $ r   c                 2    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   rA   rC   s    r   remove_line_numz/remove_extra_line_nums.<locals>.remove_line_num   s3    #,#D**Kr   rF   )r(   rJ   r   rD   s      @r   remove_extra_line_numsrK      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__rF   r   r   rM   rM      s    s8OHXr   rM   c                     t               t        t               t               t                     t        t               t               t                      fd |          j                  j                  z  S )Nc                 $   || j                   v ry | j                   j                  |       t        |t                    D ]L  }|   }|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                  t        v sM y  y )NLOADDELETESTORE	MAKE_CELLz
unhandled )rP   r    r   r   r#   HASLOCALHASFREEr9   argvalrO   rN   NotImplementedErrorr!   r"   r$   r%   )	stater&   r   r   r   r(   maymustwalks	       r   rb   zlivevars_analysis.<locals>.walk   s9   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   rM   r+   rN   )r(   instructionr   r`   ra   rb   s   ` @@@@r   livevars_analysisrd      sc    ,'GsuceSU+D
ceSUCE
*C 2 	w{#$::		!!r   c                       e Zd ZU dZeed<   y)FixedPointBoxTvalueN)rQ   rR   rS   rg   boolrT   rF   r   r   rf   rf      s    E4r   rf   c                   R    e Zd ZU eeef   ed<   eeef   ed<   eed<   d Zd Z	d Z
y)	StackSizelowhighfixed_pointc                 B    d| _         d| _        d| j                  _        y )Nr   F)rk   rl   rm   rg   )selfs    r   zerozStackSize.zero   s    	!&r   c                 .   | j                   | j                  f}t        | j                   |j                   |z         | _         t        | j                  |j                  |z         | _        | j                   | j                  f|k7  rd| j                  _        y y NFrk   rl   minmaxrm   rg   )ro   othernpriors       r   	offset_ofzStackSize.offset_of   sp    499%txxQ/		5::>2	HHdii E)%*D" *r   c                     | j                   | j                  f}t        | j                   |      | _         t        | j                  |      | _        | j                   | j                  f|k7  rd| j                  _        y y rr   rs   )ro   depthrx   s      r   exn_tab_jumpzStackSize.exn_tab_jump   s`    499%txx'		5)	HHdii E)%*D" *r   N)rQ   rR   rS   r   intfloatrT   rf   rp   ry   r|   rF   r   r   rj   rj      s5    	sEz	
U

'
++r   rj   returnc           
      $   | sJ t               }| D ci c]"  }|t        t        d      t        d      |      $ }}|| d      j                          t	        d      D ]O  }|j
                  r n@d|_        t        | | dd  d gz         D ]  \  }}||   }|j                  t        vrC|
J d|        t        |j                  |j                  d	      }||   j                  ||       |j                  t        v r?||j                     j                  |t        |j                  |j                  d	             |j                  s|j                  j                  t!        |j                  j"                        z   dz   }||j                  j                     j%                  |       " R 	 t-        d
 |j/                         D              }	t1        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)jumpc              3   4   K   | ]  }|j                     y wr   )rk   .0xs     r   	<genexpr>z%stacksize_analysis.<locals>.<genexpr>   s     2aee2   c              3   4   K   | ]  }|j                     y wr   )rl   r   s     r   r   z%stacksize_analysis.<locals>.<genexpr>   s     4!qvv4r   zfailed to reach fixed point)rf   rj   r~   rp   r   rg   r8   r#   r%   stack_effectargry   r$   r"   r!   r{   r}   lastir|   printrk   rl   rt   valuesru   )r(   rm   r   stack_sizes_	next_inst
stack_sizeeffr{   rk   rl   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*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KKs   'H)$__doc__r/   dataclassesdisr,   typingr   r   opmapr%   r    r-   r+   hasjrelhasjabsr$   r9   JUMP_OPNAMEShaslocalr[   hasfreer\   r   r   r6   r>   rG   rK   	dataclassrM   rd   rf   rj   r}   r~   r   )r#   s   0r   <module>r      s     
 
  IInIInIIo    SYYy) *w?34>23?34w>23w#?@A3;;,-1=>v

6">s||
ckk
	*KZN $   "D    + + +2(c5j(9 (g ?s   G>