a
    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re	
ejd	  e	
ejd  ne	
ejd
  ejdkre	
ejd  ejdkre	
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ee e!f d#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   M/var/www/auris/lib/python3.9/site-packages/torch/_dynamo/bytecode_analysis.py	<setcomp>)       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rt}tD ]\}}|v rB|jrBt||jj	 }|t
|k s|J t||jj d }|dksJ || |  kr|| ksn J ||  |j_	||  |j_qBfddtD S )zDead code eliminationc                    sv   t | tD ]b}|v r  d S | | }|jrH |jj  |jtv r` |j  |jtv r 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   r   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                    s&   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                    s&   d  fdd}| D ]}|| qdS )z;Remove extra starts line properties before packing bytecodeNc                    s*   | j d u rd S | j  kr d | _ n| j  d S r   r:   r<   r=   r   r   remove_line_num   s
    

z/remove_extra_line_nums.<locals>.remove_line_numr   )r&   r@   r   r   r=   r   remove_extra_line_nums   s    	rA   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   rB      s   
rB   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 ]}| }|jtv sH|jtv rd|jv s\d|jv rx|jj	vr| j
|j n6d|jv r| j	|j n|jdkrntd|j |jrƈ |jj  |jtv r |j  } |jtv r( d S q(d S )NZLOADDELETEZSTOREZ	MAKE_CELLz
unhandled )rE   r   r   r   r   HASLOCALHASFREEr   argvalrD   rC   NotImplementedErrorr   r    r!   r"   )stater#   r   r   r   r&   mayZmustwalkr   r   rR      s*    




zlivevars_analysis.<locals>.walk)r   rB   r*   rC   )r&   Zinstructionr   rP   r   livevars_analysis   s    rS   c                   @   s   e Zd ZU dZeed< dS )FixedPointBoxTvalueN)rF   rG   rH   rU   boolrI   r   r   r   r   rT      s   
rT   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)rX   rY   rZ   rU   )selfr   r   r   zero   s    zStackSize.zeroc                 C   sP   | j | jf}t| j |j | | _ t| j|j| | _| j | jf|krLd| j_d S NFrX   rY   minmaxrZ   rU   )r[   othernpriorr   r   r   	offset_of   s
    zStackSize.offset_ofc                 C   sD   | j | jf}t| j || _ t| j|| _| j | jf|kr@d| j_d S r]   r^   )r[   depthrc   r   r   r   exn_tab_jump   s
    zStackSize.exn_tab_jumpN)rF   rG   rH   r   intfloatrI   rT   r\   rd   rf   r   r   r   r   rW      s   
rW   )returnc           
   
      sd  | sJ t    fdd| D }|| d    tdD ]} jrH qd _t| | dd  d g D ]\}}|| }|jtvr|d usJ d| t|j|jdd	}|| 	|| |jt
v r||j 	|t|j|jdd	 |jrf|jjt|jj d }||jj | qfq8td
d | D }tdd | D }	 jsRJ d|dks`J |	S )Nc                    s"   i | ]}|t td td qS )infz-inf)rW   rh   r6   rZ   r   r   
<dictcomp>   s   z&stacksize_analysis.<locals>.<dictcomp>r   d   Tr(   zmissing next inst: F)Zjumpc                 s   s   | ]}|j V  qd S r   )rX   r   xr   r   r   	<genexpr>   r   z%stacksize_analysis.<locals>.<genexpr>c                 s   s   | ]}|j V  qd S r   )rY   rn   r   r   r   rp      r   zfailed to reach fixed point)rT   r\   r   rU   r8   r   r"   stack_effectargrd   r!   r    r   re   rg   lastirf   printr_   valuesr`   )
r&   Zstack_sizes_r   Z	next_inst
stack_sizeZeffre   rX   rY   r   rk   r   stacksize_analysis   s8    
 


rx   )#__doc__r.   Zdataclassesr   r+   typingr   r   opmapr"   r   r,   r*   hasjrelhasjabsr!   ZJUMP_OPNAMEShaslocalrK   hasfreerL   rq   r   r2   r9   r?   rA   Z	dataclassrB   rS   rT   rW   rg   rh   rx   r   r   r   r   <module>   sH   




-
"