o
    "i)"                     @   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r5e	ejd  ej
dkrKe	ejd	  e	ejd  ne	ejd
  ej
dkr`e	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 )$    N)AnySetUnionRETURN_VALUEJUMP_FORWARDRAISE_VARARGS   	   RERAISEr	      JUMP_BACKWARDJUMP_ABSOLUTE)r	      RETURN_CONSTc                 C   s   h | ]}t j| qS  )disopname).0opcoder   r   ]/home/ubuntu/SoloSpeech/.venv/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_indexof   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)   0   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>U       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(   
$r:   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   Z   s
    z)remove_pointless_jumps.<locals>.<setcomp>r,   Nc                    s   g | ]
}t | vr|qS r   )r;   r   r   pointless_jumpsr   r   r-   _   r.   z*remove_pointless_jumps.<locals>.<listcomp>)zip)r*   r   r?   r   remove_pointless_jumpsX   s   rB   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_numf   s   
z.propagate_line_nums.<locals>.populate_line_numr   )r*   rI   r   r   rG   r   propagate_line_numsb   s
   
rJ   c                    rC   )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   rD   rF   rG   r   r   remove_line_numv   s
   



z/remove_extra_line_nums.<locals>.remove_line_numr   )r*   rK   r   r   rG   r   remove_extra_line_numsq   s
   	
rL   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   rM      s   
 rM   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 )rP   r"   r    r!   r   HASLOCALHASFREEr   argvalrO   rN   NotImplementedErrorr#   r$   r%   r&   )stater'   r   r   r   r*   maymustwalkr   r   ra      s0   




zlivevars_analysis.<locals>.walk)r   rM   r/   rN   )r*   instructionr   r^   r   livevars_analysis   s   rc   c                   @   s   e Zd ZU dZeed< dS )FixedPointBoxTvalueN)rQ   rR   rS   re   boolrT   r   r   r   r   rd      s   
 rd   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)rh   ri   rj   re   )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rh   ri   minmaxrj   re   )rk   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 rm   rn   )rk   depthrs   r   r   r   exn_tab_jump   s   zStackSize.exn_tab_jumpN)rQ   rR   rS   r   intfloatrT   rd   rl   rt   rv   r   r   r   r   rg      s   
 rg   returnc              
      s  | sJ t    fdd| D }|| d    tdD ]} jr# nzd _t| | dd  d g D ]i\}}|| }tjdk oF|jtj	d k}|jt
vrl|d usWJ d	| |r[dnt|j|jd
d}|| || |jtv r|s||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)rg   rx   r>   rj   r   r   
<dictcomp>   s    z&stacksize_analysis.<locals>.<dictcomp>r   d   Tr,   r   CALL_FINALLYzmissing next inst: F)jumpc                 s       | ]}|j V  qd S r   )rh   r   xr   r   r   	<genexpr>       z%stacksize_analysis.<locals>.<genexpr>c                 s   r   r   )ri   r   r   r   r   r      r   zfailed to reach fixed point)rd   rl   r    re   rA   r0   r1   r   r   opmapr&   stack_effectargrt   r%   r$   r#   ru   rw   lastirv   printrh   ri   ro   valuesrp   )r*   stack_sizes_r   	next_inst
stack_sizeis_call_finallyeffru   rh   ri   r   r{   r   stacksize_analysis   sH   
 

r   )#r3   dataclassesr   r0   typingr   r   r   r   r&   r1   r"   r/   hasjrelhasjabsr%   JUMP_OPNAMEShaslocalrY   hasfreerZ   r   r   r:   rB   rJ   rL   	dataclassrM   rc   rd   rg   rw   rx   r   r   r   r   r   <module>   sF   




-
"