o
    IÆ&i("  ã                   @   sd  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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	   é   ZJUMP_BACKWARDÚJUMP_ABSOLUTEc                 C   s   h | ]}t j| ’qS © )ÚdisÚopname)Ú.0Úopcoder   r   úJC:\wamp64\www\opt\env\Lib\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)Z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&   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|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   )r4   ©r   r   ©Zpointless_jumpsr   r   r)   \   r*   z*remove_pointless_jumps.<locals>.<listcomp>)Úzip)r&   r   r8   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   ©Zcur_line_nor   r   Úpopulate_line_numc   s   
z.propagate_line_nums.<locals>.populate_line_numr   )r&   r@   r   r   r?   r   Úpropagate_line_nums_   s
   
ÿrA   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<   r>   r?   r   r   Úremove_line_nums   s
   



z/remove_extra_line_nums.<locals>.remove_line_numr   )r&   rB   r   r   r?   r   Úremove_extra_line_numsn   s
   	
ÿrC   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   rD   €   s   
 rD   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 )NZLOADÚDELETEZSTOREZ	MAKE_CELLz
unhandled )rG   r   r   r   r   ÚHASLOCALÚHASFREEr   ÚargvalrF   rE   ÚNotImplementedErrorr   r    r!   r"   )Ústater#   r   r   ©r   r&   ÚmayZmustÚwalkr   r   rT   Œ   s0   
€



ÿïzlivevars_analysis.<locals>.walk)r   rD   r+   rE   )r&   Zinstructionr   rR   r   Úlivevars_analysis‡   s   rU   c                   @   s   e Zd ZU dZeed< dS )ÚFixedPointBoxTÚvalueN)rH   rI   rJ   rW   ÚboolrK   r   r   r   r   rV   ©   s   
 rV   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)rZ   r[   r\   rW   )Ú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©rZ   r[   ÚminÚmaxr\   rW   )r]   Ú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 r_   r`   )r]   Údepthre   r   r   r   Úexn_tab_jumpÀ   s   ÿzStackSize.exn_tab_jumpN)rH   rI   rJ   r   ÚintÚfloatrK   rV   r^   rf   rh   r   r   r   r   rY   ®   s   
 rY   Úreturnc           
   
      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)rY   rj   r7   ©r\   r   r   Ú
<dictcomp>Ë   s    ÿÿz&stacksize_analysis.<locals>.<dictcomp>r   éd   Tr(   r   ZCALL_FINALLYzmissing next inst: )ZjumpFc                 S   ó   g | ]}|j ‘qS r   )rZ   ©r   Úxr   r   r   r)   õ   ó    z&stacksize_analysis.<locals>.<listcomp>c                 S   rp   r   )r[   rq   r   r   r   r)   ö   rs   zfailed to reach fixed point)rV   r^   r   rW   r9   r,   r-   r   r   Úopmapr"   rf   Ústack_effectÚargr!   r    r   rg   ri   Úlastirh   ÚprintrZ   r[   ra   Úvaluesrb   )
r&   Zstack_sizesÚ_r   Z	next_instÚ
stack_sizeZis_call_finallyrg   rZ   r[   r   rm   r   Ústacksize_analysisÈ   sF   
þ ÿ
þ
ÿ€èr|   )#r/   Údataclassesr   r,   Útypingr   r   r   rt   r"   r-   r   r+   ÚhasjrelÚhasjabsr!   ZJUMP_OPNAMESÚhaslocalrM   ÚhasfreerN   ru   r   r3   r:   rA   rC   Ú	dataclassrD   rU   rV   rY   ri   rj   r|   r   r   r   r   Ú<module>   sB    ý



-
"