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j
dkrme	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_CONST)r	      JUMP_BACKWARD_NO_INTERRUPTc                 C   s   h | ]}t j| qS  )disopname).0opcoder   r   ]/home/ubuntu/transcripts/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+   3   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>X       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   ]   s
    z)remove_pointless_jumps.<locals>.<setcomp>r.   Nc                    s   g | ]
}t | vr|qS r   )r=   r   r   pointless_jumpsr   r   r/   b   r0   z*remove_pointless_jumps.<locals>.<listcomp>)zip)r,   r   rA   r   remove_pointless_jumps[   s   rD   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_numi   s   
z.propagate_line_nums.<locals>.populate_line_numr   )r,   rK   r   r   rI   r   propagate_line_numse   s
   
rL   c                    rE   )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!   rF   rH   rI   r   r   remove_line_numy   s
   



z/remove_extra_line_nums.<locals>.remove_line_numr   )r,   rM   r   r   rI   r   remove_extra_line_numst   s
   	
rN   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   rO      s   
 rO   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 )rR   r$   r"   r#   r   HASLOCALHASFREEr   argvalrQ   rP   NotImplementedErrorr%   r&   r'   r(   )stater)   r   r   r   r,   maymustwalkr   r   rc      s0   




zlivevars_analysis.<locals>.walk)r    rO   r1   rP   )r,   instructionr   r`   r   livevars_analysis   s   re   c                   @   s   e Zd ZU dZeed< dS )FixedPointBoxTvalueN)rS   rT   rU   rg   boolrV   r   r   r   r   rf      s   
 rf   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)rj   rk   rl   rg   )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rj   rk   minmaxrl   rg   )rm   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 ro   rp   )rm   depthru   r   r   r   exn_tab_jump   s   zStackSize.exn_tab_jumpN)rS   rT   rU   r   intfloatrV   rf   rn   rv   rx   r   r   r   r   ri      s   
 ri   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)ri   rz   r@   rl   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!   )rj   r   xr   r   r   	<genexpr>       z%stacksize_analysis.<locals>.<genexpr>c                 s   r   r!   )rk   r   r   r   r   r      r   zfailed to reach fixed point)rf   rn   r"   rg   rC   r2   r3   r   r   opmapr(   stack_effectargrv   r'   r&   r%   rw   ry   lastirx   printrj   rk   rq   valuesrr   )r,   stack_sizes_r   	next_inst
stack_sizeis_call_finallyeffrw   rj   rk   r   r}   r   stacksize_analysis   sH   
 

r   )#r5   dataclassesr   r2   typingr   r   r   r   r(   r3   r$   r1   hasjrelhasjabsr'   JUMP_OPNAMEShaslocalr[   hasfreer\   r   r    r<   rD   rL   rN   	dataclassrO   re   rf   ri   ry   rz   r   r   r   r   r   <module>   sJ   





-
"