o
    ÜÜÓhæ   ã                   @   sN  d dl Z d dlZd dlZd dlZd dlmZ ejd ejd ejd hZejdkr1e 	ejd ¡ ejdkrGe 	ejd	 ¡ e 	ejd ¡ n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d „ ZdS )!é    N)ÚRealÚRETURN_VALUEÚJUMP_FORWARDÚRAISE_VARARGS©é   é	   ÚRERAISE©r   é   ÚJUMP_BACKWARDÚJUMP_ABSOLUTEc                 C   s   h | ]}t j| ’qS © )ÚdisÚopname)Ú.0Úopcoder   r   úU/var/www/html/ai/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%   -   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>R   ó    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(   
ÿÿ$€r6   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   W   s
    þz)remove_pointless_jumps.<locals>.<setcomp>r(   Nc                    s   g | ]
}t |ƒˆ vr|‘qS r   )r7   ©r   r   ©Úpointless_jumpsr   r   r)   \   r*   z*remove_pointless_jumps.<locals>.<listcomp>)Úzip)r&   r   r;   r   Úremove_pointless_jumpsU   s   þr>   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_numc   s   
z.propagate_line_nums.<locals>.populate_line_numr   )r&   rE   r   r   rC   r   Úpropagate_line_nums_   s
   
ÿrF   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@   rB   rC   r   r   Úremove_line_nums   s
   



z/remove_extra_line_nums.<locals>.remove_line_numr   )r&   rG   r   r   rC   r   Úremove_extra_line_numsn   s
   	
ÿrH   c                   @   s&   e Zd ZU eed< eed< eed< dS )ÚReadsWritesÚreadsÚwritesÚvisitedN)Ú__name__Ú
__module__Ú__qualname__r+   Ú__annotations__r   r   r   r   rI   €   s   
 rI   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 )rL   r   r   r   r   ÚHASLOCALÚHASFREEr   ÚargvalrK   rJ   ÚNotImplementedErrorr   r    r!   r"   )Ústater#   r   r   ©r   r&   ÚmayÚmustÚwalkr   r   r]   Œ   s0   
€



ÿïzlivevars_analysis.<locals>.walk)r   rI   r+   rJ   )r&   Úinstructionr   rZ   r   Úlivevars_analysis‡   s   r_   c                   @   s   e Zd ZU dZeed< dS )ÚFixedPointBoxTÚvalueN)rM   rN   rO   ra   ÚboolrP   r   r   r   r   r`   ©   s   
 r`   c                   @   s>   e Zd ZU eed< e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)rd   re   rf   ra   )Ú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©rd   re   ÚminÚmaxrf   ra   )rg   Ú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 ri   rj   )rg   Údepthro   r   r   r   Úexn_tab_jumpÀ   s   ÿzStackSize.exn_tab_jumpN)	rM   rN   rO   r   rP   r`   rh   rp   rr   r   r   r   r   rc   ®   s   
 rc   c           
   
      sz  | sJ ‚t ƒ ‰ ‡ fdd„| D ƒ}|| d   ¡  tdƒD ]z}ˆ jr# ntdˆ _t| | dd … d g ƒD ]c\}}|| }tjdk oF|jtj	d k}|jt
vrf|d usWJ d	|› ƒ‚||  |t|j|j|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sµJ dƒ‚|dks»J ‚|	S )Nc                    s"   i | ]}|t td ƒtdƒˆ ƒ“qS )Úinfz-inf)rc   Úfloatr:   ©rf   r   r   Ú
<dictcomp>Ë   s    ÿÿz&stacksize_analysis.<locals>.<dictcomp>r   éd   Tr(   r   ÚCALL_FINALLYzmissing next inst: )ÚjumpFc                 S   ó   g | ]}|j ‘qS r   )rd   ©r   Úxr   r   r   r)   õ   ó    z&stacksize_analysis.<locals>.<listcomp>c                 S   rz   r   )re   r{   r   r   r   r)   ö   r}   zfailed to reach fixed point)r`   rh   r   ra   r=   r,   r-   r   r   Úopmapr"   rp   Ústack_effectÚargr!   r    r   rq   ÚintÚlastirr   Úprintrd   re   rk   Úvaluesrl   )
r&   Ústack_sizesÚ_r   Ú	next_instÚ
stack_sizeÚis_call_finallyrq   rd   re   r   ru   r   Ústacksize_analysisÈ   sF   
þ ÿ
þ
ÿ€èrŠ   )r/   Údataclassesr   r,   Únumbersr   r~   r"   r-   r   r+   ÚhasjrelÚhasjabsr!   ÚJUMP_OPNAMESÚhaslocalrU   ÚhasfreerV   r   r   r6   r>   rF   rH   Ú	dataclassrI   r_   r`   rc   rŠ   r   r   r   r   Ú<module>   sB    ý



-
"