o
     Ǝi#                     @   s&  d Z 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r$ddl	m
Z
 ejd ejd ejd hZeejd	  ejd
krPeejd  eejd  neejd  dej  krcdk rmn neejd  ejdkrze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ed dedef fddZded ded fddZded ded fddZded ddfddZded ddfd d!Z ej!G d"d# d#Z"ded d$ddee fd%d&Z#ej!G d'd( d(Z$ej!G d)d* d*Z%ded deee&f fd+d,Z'dS )-a  
This module provides utilities for analyzing and optimizing Python bytecode.
Key functionality includes:
- Dead code elimination
- Jump instruction optimization
- Stack size analysis and verification
- Live variable analysis
- Line number propagation and cleanup
- Exception table handling for Python 3.11+

The utilities in this module are used to analyze and transform bytecode
for better performance while maintaining correct semantics.
    N)AnyTYPE_CHECKINGUnion   )InstructionRETURN_VALUEJUMP_FORWARDRAISE_VARARGSRERAISE      JUMP_BACKWARDJUMP_ABSOLUTE)r      )r      RETURN_CONST)r      JUMP_BACKWARD_NO_INTERRUPTc                 C   s   h | ]}t j| qS  )disopname).0opcoder   r   [/home/jeff/fluffinator/venv/lib/python3.10/site-packages/torch/_dynamo/bytecode_analysis.py	<setcomp>,   s    r   instsr   returnc                 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)r   indexofiinstr   r   r   get_indexof3   s
   
r"   instructionsc                    s  t t dtddf fdd  d tjdkrxt}tD ]Q\}}|v rw|jrwt	||jj
 }|t|k sCJ t||jj d }|dksUJ || |  krd|| ksgJ  J ||  |j_
||  |j_q&fd	d
tD S )zDead code eliminationstartr   Nc                    s   t | tD ]8}|v r d S | | }|jr$ |jj  |jtv r7|jd us0J  |j  |jtv r? d S qd S N)rangelenaddexn_tab_entrytargetr   JUMP_OPCODESTERMINAL_OPCODES)r$   r    r!   find_live_coder   r#   	live_coder   r   r.   D   s   


z(remove_dead_code.<locals>.find_live_coder   r   r   c                    s   g | ]
\}}| v r|qS r   r   )r   r    r!   )r/   r   r   
<listcomp>j       z$remove_dead_code.<locals>.<listcomp>)r"   setint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   o   s
    z)remove_pointless_jumps.<locals>.<setcomp>r   Nc                    s   g | ]
}t | vr|qS r   )r?   r   r!   pointless_jumpsr   r   r0   t   r1   z*remove_pointless_jumps.<locals>.<listcomp>)zip)r#   r   rC   r   remove_pointless_jumpsm   s   rF   c                    (   d d fdd}| D ]}|| qdS )zEEnsure every instruction has line number set in case some are removedNr!   r   r   c                    s   | j r| j   | _ d S r%   starts_liner!   cur_line_nor   r   populate_line_num{   s   
z.propagate_line_nums.<locals>.populate_line_numr!   r   r   Nr   )r#   rM   r!   r   rK   r   propagate_line_numsw   s
   
rO   c                    rG   )z;Remove extra starts line properties before packing bytecodeNr!   r   r   c                    s,   | j d u rd S | j  krd | _ d S | j  d S r%   rH   rJ   rK   r   r   remove_line_num   s
   



z/remove_extra_line_nums.<locals>.remove_line_numrN   r   )r#   rP   r!   r   rK   r   remove_extra_line_nums   s
   	
rQ   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__r2   r   __annotations__r   r   r   r   rR      s   
 rR   instructionc                    sh   t  tt t t tt t t dtdtdd f fdd |  jjB S )Nstater$   r   c                    s  || j v rd S | j | t|tD ]m}| }|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 ry|jd usoJ  |j  } |jtv r d S qd S )NLOADDELETESTORE	MAKE_CELLz
unhandled )rU   r(   r&   r'   r   HASLOCALHASFREEr   argvalrT   rS   NotImplementedErrorr)   r*   r+   r,   )r[   r$   r    r!   r   r#   maymustwalkr   r   rg      s2   




zlivevars_analysis.<locals>.walk)r"   rR   r2   r3   rS   )r#   rZ   r   rd   r   livevars_analysis   s   "rh   c                   @   s   e Zd ZU dZeed< dS )FixedPointBoxTvalueN)rV   rW   rX   rj   boolrY   r   r   r   r   ri      s   
 ri   c                   @   sh   e Zd ZU eeef ed< eeef ed< eed< dddZdd d	eddfd
dZ	deddfddZ
dS )	StackSizelowhighfixed_pointr   Nc                 C   s   d| _ d| _d| j_d S )Nr   F)rm   rn   ro   rj   )selfr   r   r   zero   s   zStackSize.zeroothernc                 C   sT   | j | jf}t| j |j | | _ t| j|j| | _| j | jf|kr(d| j_d S d S NFrm   rn   minmaxro   rj   )rp   rr   rs   priorr   r   r   	offset_of   s   zStackSize.offset_ofdepthc                 C   sH   | j | jf}t| j || _ t| j|| _| j | jf|kr"d| j_d S d S rt   ru   )rp   rz   rx   r   r   r   exn_tab_jump   s   zStackSize.exn_tab_jump)r   N)rV   rW   rX   r   r3   floatrY   ri   rq   ry   r{   r   r   r   r   rl      s   
 
rl   c           
   
      sv  | sJ t    fdd| D }|| d    tdD ]y} jr# nsd _t| | dd  d g D ]b\}}|| }|jtvr[|d usJJ d| t|j|jdd	}|| 	|| |jt
v r||jd uslJ d
| ||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)rl   r|   rB   ro   r   r   
<dictcomp>   s    z&stacksize_analysis.<locals>.<dictcomp>r   d   Tr   zmissing next inst: F)jumpzmissing target: c                 s       | ]}|j V  qd S r%   )rm   r   xr   r   r   	<genexpr>      z%stacksize_analysis.<locals>.<genexpr>c                 s   r   r%   )rn   r   r   r   r   r     r   zfailed to reach fixed point)ri   rq   r&   rj   rE   r   r,   stack_effectargry   r+   r*   r)   rz   r3   lastir{   rv   valuesrw   )
r#   stack_sizes_r!   	next_inst
stack_sizeeffrz   rm   rn   r   r~   r   stacksize_analysis   s>   
 


r   )(__doc__r7   dataclassesr   r4   typingr   r   r   bytecode_transformationr   opmapr,   r(   r5   r2   hasjrelhasjabsr+   JUMP_OPNAMEShaslocalr`   hasfreera   r   listdictr3   r"   r>   rF   rO   rQ   	dataclassrR   rh   ri   rl   r|   r   r   r   r   r   <module>   sZ    



.

%"