o
    ZhM!                     @   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      ZJUMP_BACKWARDJUMP_ABSOLUTE)r	      ZRETURN_CONST)r	      ZJUMP_BACKWARD_NO_INTERRUPTc                 C   s   h | ]}t j| qS  )disopname).0opcoder   r   N/var/www/auris/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)Z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%   Zlive_idxr   r   Z	start_idxZend_idxr   r#   r   remove_dead_code<   s(   
$r2   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   )r3   r   r   Zpointless_jumpsr   r   r(   p   r)   z*remove_pointless_jumps.<locals>.<listcomp>)zip)r%   r   r7   r   remove_pointless_jumpsi   s   r9   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   Zcur_line_nor   r   populate_line_numw   s   
z.propagate_line_nums.<locals>.populate_line_numr   )r%   r?   r   r   r>   r   propagate_line_numss   s
   
r@   c                    r:   )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   r;   r=   r>   r   r   remove_line_num   s
   



z/remove_extra_line_nums.<locals>.remove_line_numr   )r%   rA   r   r   r>   r   remove_extra_line_nums   s
   	
rB   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   rC      s   
 rC   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 )NZLOADDELETEZSTOREZ	MAKE_CELLz
unhandled )rF   r   r   r   r   HASLOCALHASFREEr   argvalrE   rD   NotImplementedErrorr   r   r    r!   )stater"   r   r   r   r%   mayZmustwalkr   r   rS      s0   




zlivevars_analysis.<locals>.walk)r   rC   r*   rD   )r%   Zinstructionr   rQ   r   livevars_analysis   s   rT   c                   @   s   e Zd ZU dZeed< dS )FixedPointBoxTvalueN)rG   rH   rI   rV   boolrJ   r   r   r   r   rU      s   
 rU   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)rY   rZ   r[   rV   )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rY   rZ   minmaxr[   rV   )r\   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 r^   r_   )r\   depthrd   r   r   r   exn_tab_jump   s   zStackSize.exn_tab_jumpN)rG   rH   rI   r   intfloatrJ   rU   r]   re   rg   r   r   r   r   rX      s   
 rX   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)rX   ri   r6   r[   r   r   
<dictcomp>   s    z&stacksize_analysis.<locals>.<dictcomp>r   d   Tr'   zmissing next inst: F)Zjumpc                 s       | ]}|j V  qd S r   )rY   r   xr   r   r   	<genexpr>       z%stacksize_analysis.<locals>.<genexpr>c                 s   ro   r   )rZ   rp   r   r   r   rr      rs   zfailed to reach fixed point)rU   r]   r   rV   r8   r   r!   stack_effectargre   r    r   r   rf   rh   lastirg   printrY   rZ   r`   valuesra   )
r%   Zstack_sizes_r   Z	next_inst
stack_sizeZeffrf   rY   rZ   r   rl   r   stacksize_analysis   s>   
 


r{   )#__doc__r.   dataclassesr   r+   typingr   r   opmapr!   r   r,   r*   hasjrelhasjabsr    ZJUMP_OPNAMEShaslocalrL   hasfreerM   rt   r   r2   r9   r@   rB   	dataclassrC   rT   rU   rX   rh   ri   r{   r   r   r   r   <module>   sJ   




-
"