o
    IhM!                     @   s  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	
ejd  ejdkrFe	
ejd	  e	
ejd  ne	
ejd
  ejdkr[e	
ejd  ejdkrhe	
ejd  eejej Zdd eD ZeejZeejZejZdd Zdd Zdd Zdd Zdd ZejG dd dZdd ZejG dd  d ZejG d!d" d"Zd#ee e!f fd$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UnionRETURN_VALUEJUMP_FORWARDRAISE_VARARGSRERAISE      JUMP_BACKWARDJUMP_ABSOLUTE)r	      RETURN_CONST)r	      JUMP_BACKWARD_NO_INTERRUPTc                 C   s   h | ]}t j| qS  )disopname).0opcoder   r   S/var/www/vscode/kcb/lib/python3.10/site-packages/torch/_dynamo/bytecode_analysis.py	<setcomp>)   s    r   c                 C   s.   i }t | D ]\}}||vsJ |||< q|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instr   r   r   get_indexof0   s
   
r   c                    s   t t  fdd  d tjdkrst}tD ]Q\}}|v rr|jrrt||jj	 }|t
|k s>J t||jj d }|dksPJ || |  kr_|| ksbJ  J ||  |j_	||  |j_q!fddtD S )zDead code eliminationc                    sv   t | tD ]1}|v r d S | | }|jr$ |jj  |jtv r0 |j  |jtv r8 d S qd S N)rangelenaddexn_tab_entrytargetr   JUMP_OPCODESTERMINAL_OPCODES)startr   r   find_live_coder   instructions	live_coder   r   r(   A   s   


z(remove_dead_code.<locals>.find_live_coder   r      c                    s   g | ]
\}}| v r|qS r   r   )r   r   r   )r*   r   r   
<listcomp>f       z$remove_dead_code.<locals>.<listcomp>)r   setsysversion_infosortedr   r"   bisectbisect_leftr&   r    bisect_rightend)r)   live_idxr   r   	start_idxend_idxr   r'   r   remove_dead_code<   s(   
$r9   c                    s.   dd t | | dd D   fdd| D S )z'Eliminate jumps to the next instructionc                 S   s,   h | ]\}}|j d kr|j|u rt|qS )r   )r   r#   id)r   abr   r   r   r   k   s
    z)remove_pointless_jumps.<locals>.<setcomp>r+   Nc                    s   g | ]
}t | vr|qS r   )r:   r   r   pointless_jumpsr   r   r,   p   r-   z*remove_pointless_jumps.<locals>.<listcomp>)zip)r)   r   r>   r   remove_pointless_jumpsi   s   rA   c                    &   d  fdd}| D ]}|| q
dS )zEEnsure every instruction has line number set in case some are removedNc                    s   | j r| j   | _ d S r   starts_liner   cur_line_nor   r   populate_line_numw   s   
z.propagate_line_nums.<locals>.populate_line_numr   )r)   rH   r   r   rF   r   propagate_line_numss   s
   
rI   c                    rB   )z;Remove extra starts line properties before packing bytecodeNc                    s,   | j d u rd S | j  krd | _ d S | j  d S r   rC   rE   rF   r   r   remove_line_num   s
   



z/remove_extra_line_nums.<locals>.remove_line_numr   )r)   rJ   r   r   rF   r   remove_extra_line_nums   s
   	
rK   c                   @   s2   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__r.   r   __annotations__r   r   r   r   rL      s   
 rL   c                    sZ   t  tt t t tt t t  fdd |  jjB S )Nc                    s   || j v rd S | j | t|tD ]f}| }|jtv s$|jtv rWd|jv s.d|jv r<|jj	vr;| j
|j nd|jv rI| j	|j n|jdkrOntd|j |jrc |jj  |jtv rr |j  } |jtv rz d S qd S )NLOADDELETESTORE	MAKE_CELLz
unhandled )rO   r!   r   r    r   HASLOCALHASFREEr   argvalrN   rM   NotImplementedErrorr"   r#   r$   r%   )stater&   r   r   r   r)   maymustwalkr   r   r`      s0   




zlivevars_analysis.<locals>.walk)r   rL   r.   rM   )r)   instructionr   r]   r   livevars_analysis   s   rb   c                   @   s   e Zd ZU dZeed< dS )FixedPointBoxTvalueN)rP   rQ   rR   rd   boolrS   r   r   r   r   rc      s   
 rc   c                   @   sN   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 Z	dd	 Z
d
S )	StackSizelowhighfixed_pointc                 C   s   d| _ d| _d| j_d S )Nr   F)rg   rh   ri   rd   )selfr   r   r   zero   s   zStackSize.zeroc                 C   sT   | j | jf}t| j |j | | _ t| j|j| | _| j | jf|kr(d| j_d S d S NFrg   rh   minmaxri   rd   )rj   othernpriorr   r   r   	offset_of   s   zStackSize.offset_ofc                 C   sH   | j | jf}t| j || _ t| j|| _| j | jf|kr"d| j_d S d S rl   rm   )rj   depthrr   r   r   r   exn_tab_jump   s   zStackSize.exn_tab_jumpN)rP   rQ   rR   r   intfloatrS   rc   rk   rs   ru   r   r   r   r   rf      s   
 rf   returnc           
   
      s`  | sJ t    fdd| D }|| d    tdD ]m} jr# ngd _t| | dd  d g D ]V\}}|| }|jtvr[|d usJJ d| t|j|jdd	}|| 	|| |jt
v rp||j 	|t|j|jdd	 |jr|jjt|jj d }||jj | q2q	 td
d | D }tdd | D }	 jsJ d|dksJ |	S )Nc                    s"   i | ]}|t td td qS )infz-inf)rf   rw   r=   ri   r   r   
<dictcomp>   s    z&stacksize_analysis.<locals>.<dictcomp>r   d   Tr+   zmissing next inst: F)jumpc                 s       | ]}|j V  qd S r   )rg   r   xr   r   r   	<genexpr>       z%stacksize_analysis.<locals>.<genexpr>c                 s   r~   r   )rh   r   r   r   r   r      r   zfailed to reach fixed point)rc   rk   r   rd   r@   r   r%   stack_effectargrs   r$   r#   r"   rt   rv   lastiru   printrg   rh   rn   valuesro   )
r)   stack_sizes_r   	next_inst
stack_sizeeffrt   rg   rh   r   rz   r   stacksize_analysis   s>   
 


r   )#__doc__r2   dataclassesr   r/   typingr   r   opmapr%   r!   r0   r.   hasjrelhasjabsr$   JUMP_OPNAMEShaslocalrX   hasfreerY   r   r   r9   rA   rI   rK   	dataclassrL   rb   rc   rf   rv   rw   r   r   r   r   r   <module>   sJ   




-
"