U
    zh)"                     @   s~  d dl Z d dlZd dlZd dlZd dlmZmZmZ ejd ejd ejd hZ	ej
dkrje	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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 )$    N)AnySetUnionRETURN_VALUEJUMP_FORWARDRAISE_VARARGS   	   ZRERAISEr	      ZJUMP_BACKWARDJUMP_ABSOLUTE)r	      ZRETURN_CONSTc                 C   s   h | ]}t j| qS  )disopname).0opcoder   r   Q/var/www/html/venv/lib/python3.8/site-packages/torch/_dynamo/bytecode_analysis.py	<setcomp>   s     r   c                 C   s.   i }t | D ]\}}||ks t|||< 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AssertionError)Zinstsindexofiinstr   r   r   get_indexof   s
    
r   c                    s   t t  fdd  d tjdkrt}tD ]\}}|krB|jrBt||jj	 }|t
|k s|tt||jj d }|dkst|| |  kr|| ksn t||  |j_	||  |j_qBfddtD S )zDead code eliminationc                    sv   t | tD ]b}|kr  d S | | }|jrH |jj  |jtkr` |j  |jtk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&   0   s    


z(remove_dead_code.<locals>.find_live_coder   r      c                    s   g | ]\}}| kr|qS r   r   )r   r   r   )r(   r   r   
<listcomp>U   s      z$remove_dead_code.<locals>.<listcomp>)r   setsysversion_infosortedr   r    bisectbisect_leftr$   r   r   bisect_rightend)r'   Zlive_idxr   r   Z	start_idxZend_idxr   r%   r   remove_dead_code+   s(    
 
"r3   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|krt|qS )r   )r   r!   id)r   abr   r   r   r   Z   s   
 
z)remove_pointless_jumps.<locals>.<setcomp>r)   Nc                    s   g | ]}t | kr|qS r   )r4   r   r   Zpointless_jumpsr   r   r*   _   s      z*remove_pointless_jumps.<locals>.<listcomp>)zip)r'   r   r8   r   remove_pointless_jumpsX   s    r:   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_numf   s    z.propagate_line_nums.<locals>.populate_line_numr   )r'   r?   r   r   r>   r   propagate_line_numsb   s    r@   c                    s&   d  fdd}| D ]}|| qdS )z;Remove extra starts line properties before packing bytecodeNc                    s*   | j d krd S | j  kr d | _ n| j  d S r   r;   r=   r>   r   r   remove_line_numv   s
    

z/remove_extra_line_nums.<locals>.remove_line_numr   )r'   rA   r   r   r>   r   remove_extra_line_numsq   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 krd S | j | t|tD ]}| }|jtksH|jtkrd|jks\d|jkrx|jj	kr| j
|j n6d|jkr| j	|j n|jdkrntd|j |jrƈ |jj  |jtkr |j  } |jtkr( 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      s*    




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   sP   | j | jf}t| j |j | | _ t| j|j| | _| j | jf|krLd| j_d S NFrY   rZ   minmaxr[   rV   )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\   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t t   fdd| D }|| d    tdD ]} jrJ qBd _t| | dd  d g D ]\}}|| }tjdk o|jt	j
d k}|jtkr|d k	st d	| |rdnt|j|jd
d}|| || |jtkr|s||j |t|j|jdd |jrh|jjt|jj d }||jj | qhq8tdd | D }	tdd | D }
 js~t d|	dkst |
S )Nc                    s"   i | ]}|t td td qS )infz-inf)rX   ri   r7   r[   r   r   
<dictcomp>   s    z&stacksize_analysis.<locals>.<dictcomp>r   d   Tr)   r   CALL_FINALLYzmissing next inst: F)Zjumpc                 s   s   | ]}|j V  qd S r   )rY   r   xr   r   r   	<genexpr>   s     z%stacksize_analysis.<locals>.<genexpr>c                 s   s   | ]}|j V  qd S r   )rZ   rp   r   r   r   rr      s     zfailed to reach fixed point)r   rU   r]   r   rV   r9   r,   r-   r   r   opmapr#   stack_effectargre   r"   r!   r    rf   rh   lastirg   printr`   valuesra   )r'   Zstack_sizes_r   Z	next_inst
stack_sizeZis_call_finallyZeffrf   rY   rZ   r   rl   r   stacksize_analysis   sD    
 

 r{   )#r/   dataclassesr   r,   typingr   r   r   rs   r#   r-   r   r+   hasjrelhasjabsr"   ZJUMP_OPNAMEShaslocalrL   hasfreerM   rt   r   r3   r:   r@   rB   	dataclassrC   rT   rU   rX   rh   ri   r{   r   r   r   r   <module>   sD   




-
"