o
    i9:j#                     @   s&  d Z ddlZddlZddlZddlZddlZddl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rReejd  eejd  neejd  dej  kredk ron 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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&B 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   )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   f/home/nk/hobo-godmode/plappi-mvp/.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_indexof5   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-   G   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>m       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_codeB   s(   
$r=   c                    s&   dd t | 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   r   s
    z)remove_pointless_jumps.<locals>.<setcomp>c                    s   g | ]
}t | vr|qS r   )r>   r   r    pointless_jumpsr   r   r/   w   r0   z*remove_pointless_jumps.<locals>.<listcomp>)	itertoolspairwise)r"   r   rB   r   remove_pointless_jumpsp   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_numsz   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__r1   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   r1   r2   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                   @   s`   e Zd ZU eeB ed< eeB 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   r2   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|   rA   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   zipr   r+   stack_effectargry   r*   r)   r(   rz   r2   lastir{   rv   valuesrw   )
r"   stack_sizes_r    	next_inst
stack_sizeeffrz   rm   rn   r   r~   r   stacksize_analysis   s>   
 


r   )(__doc__r6   dataclassesr   rD   r3   typingr   r   bytecode_transformationr   opmapr+   r'   r4   r1   hasjrelhasjabsr*   JUMP_OPNAMEShaslocalr`   hasfreera   r   listdictr2   r!   r=   rF   rO   rQ   	dataclassrR   rh   ri   rl   r|   r   r   r   r   r   <module>   s\    



.

%