
    9i#                        S r SSKrSSKrSSKrSSKrSSKJrJrJr  \(       a  SSK	J
r
  \R                  S   \R                  S   \R                  S   1r\R                  \R                  S	   5        \R                  S
:  a=  \R                  \R                  S   5        \R                  \R                  S   5        O\R                  \R                  S   5        S\R                  s=::  a  S:  a!  O  O\R                  \R                  S   5        \R                  S:  a  \R                  \R                  S   5        \" \R                   \R"                  -   5      r\ V s1 s H  n \R&                  U    iM     sn r\" \R*                  5      r\" \R.                  5      r\R2                  rS\S   S\S\4   4S jrS\S   S\S   4S jrS\S   S\S   4S jrS\S   SS4S jr S\S   SS4S jr!\RD                   " S S5      5       r#S\S   SSS\\   4S jr$\RD                   " S S 5      5       r%\RD                   " S! S"5      5       r&S\S   S\\\'4   4S# jr(gs  sn f )$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_INTERRUPTinstsr   returnc                 H    0 n[        U 5       H  u  p#X1;  d   eX!U'   M     U$ )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insts       _/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/torch/_dynamo/bytecode_analysis.pyget_indexofr   3   s4    
 GU#""" $ N    instructionsc                   ^ ^^^ [        T 5      m[        5       mS[        SS4UUU U4S jjmT" S5        [        R                  S:  a  [        T5      n[        T 5       H  u  p#UT;   d  M  UR                  (       d  M   [        R                  " UTUR                  R                     5      nU[        U5      :  d   e[        R                  " UTUR                  R                     5      S-
  nUS:  d   eX   Us=::  a	  X   ::  d   e   eT X      UR                  l
        T X      UR                  l        M     [        T 5       VVs/ s H  u  p#UT;   d  M  UPM     snn$ s  snnf )zDead code eliminationstartr   Nc                 v  > [        U [        T5      5       H  nUT;   a    g TR                  U5        TU   nUR                  (       a  T" TUR                  R                     5        UR
                  [        ;   a$  UR                  c   eT" TUR                     5        UR
                  [        ;   d  M    g    g N)rangelenaddexn_tab_entrytargetopcodeJUMP_OPCODESTERMINAL_OPCODES)r"   r   r   find_live_coder   r    	live_codes      r   r-   (remove_dead_code.<locals>.find_live_codeD   s    uc,/0AI~MM!?D!!wt'9'9'@'@AB{{l*{{...wt{{34{{.. 1r   r   r   r   )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.   s	   `     @@@r   remove_dead_coder<   ?   s]   ,'GIc d   1 7")$ .GAI~$"4"4"4"..gd&8&8&>&>?	 !3x=000 '''$:L:L:P:P2QRUVV  !|#|*aD83DDDDDD+78K+L""()5h6G)H""& /  !*, 7J 7WQ1	>D 7JJJs   E%E%c                     [        X SS 5       VVs1 s H3  u  pUR                  S:X  d  M  UR                  UL d  M(  [        U5      iM5     nnnU  Vs/ s H  n[        U5      U;  d  M  UPM     sn$ s  snnf s  snf )z'Eliminate jumps to the next instructionr   Nr   )zipopnamer)   id)r    abpointless_jumpsr   s        r   remove_pointless_jumpsrD   m   s     12&677DA88& 	+,88q= 	17  
 *M\TRX_-LD\MM
 Ns   A3A3A3A9*A9c                 <   ^ SmSU4S jjnU  H  nU" U5        M     g)zEEnsure every instruction has line number set in case some are removedNc                 N   > U R                   (       a  U R                   mTU l         g r$   starts_liner   cur_line_nos    r   populate_line_num.propagate_line_nums.<locals>.populate_line_num{   s    **K&r   r   r   r   N )r    rK   r   rJ   s      @r   propagate_line_numsrO   w   s!    K' $ r   c                 <   ^ SmSU4S jjnU  H  nU" U5        M     g)z;Remove extra starts line properties before packing bytecodeNc                 j   > U R                   c  g U R                   T:X  a  S U l         g U R                   mg r$   rG   rI   s    r   remove_line_num/remove_extra_line_nums.<locals>.remove_line_num   s3    #,#D**Kr   rM   rN   )r    rR   r   rJ   s      @r   remove_extra_line_numsrT      s#     K+  r   c                   F    \ rS rSr% \\   \S'   \\   \S'   \\   \S'   Srg)ReadsWrites   readswritesvisitedrN   N)__name__
__module____qualname____firstlineno__r0   r   __annotations____static_attributes__rN   r   r   rV   rV      s    s8OHXr   rV   instructionc                 4  ^ ^^^^ [        T 5      m[        [        5       [        5       [        5       5      m[        [        5       [        5       [        5       5      mS[        S[        SS 4UU UUU4S jjmT" TTU   5        TR                  TR                  -  $ )Nstater"   r   c                 t  > XR                   ;   a  g U R                   R                  U5        [        U[        T5      5       GHr  nTU   nUR                  [
        ;   d  UR                  [        ;   a  SUR                  ;   d  SUR                  ;   a@  UR                  TR                  ;  a%  U R                  R                  UR                  5        O_SUR                  ;   a&  U R                  R                  UR                  5        O)UR                  S:X  a  O[        SUR                   35      eUR                  (       a   T" TTUR                  R                     5        UR                  [        ;   a'  UR                  c   eT" TTUR                     5        Tn UR                  [        ;   d  GMs    g    g )NLOADDELETESTORE	MAKE_CELLz
unhandled )rZ   r'   r%   r&   r*   HASLOCALHASFREEr?   argvalrY   rX   NotImplementedErrorr(   r)   r+   r,   )	rc   r"   r   r   r   r    maymustwalks	       r   ro   livevars_analysis.<locals>.walk   sC   MM!% uc,/0A?D{{h&$++*@T[[(H,C{{$++54+LL$$T[[1[[K/-
4;;-.HII!!S'$"4"4";";<={{l*{{...S'$++./{{..' 1r   )r   rV   r0   r1   rX   )r    ra   r   rm   rn   ro   s   ` @@@@r   livevars_analysisrq      sz     ,'GsuceSU+D
ceSUCE
*CK    4 	w{#$::		!!r   c                   $    \ rS rSr% Sr\\S'   Srg)FixedPointBox   TvaluerN   N)r[   r\   r]   r^   ru   boolr_   r`   rN   r   r   rs   rs      s    E4r   rs   c                   z    \ rS rSr% \\\4   \S'   \\\4   \S'   \\S'   SS jr	SS S	\SS4S
 jr
S\SS4S jrSrg)	StackSize   lowhighfixed_pointr   Nc                 B    SU l         SU l        SU R                  l        g )Nr   F)rz   r{   r|   ru   )selfs    r   zeroStackSize.zero   s    	!&r   othernc                 0   U R                   U R                  4n[        U R                   UR                   U-   5      U l         [        U R                  UR                  U-   5      U l        U R                   U R                  4U:w  a  SU R                  l        g g NFrz   r{   minmaxr|   ru   )r~   r   r   priors       r   	offset_ofStackSize.offset_of   sp    499%txxQ/		5::>2	HHdii E)%*D" *r   depthc                     U R                   U R                  4n[        U R                   U5      U l         [        U R                  U5      U l        U R                   U R                  4U:w  a  SU R                  l        g g r   r   )r~   r   r   s      r   exn_tab_jumpStackSize.exn_tab_jump   s`    499%txx'		5)	HHdii E)%*D" *r   )r{   rz   )r   N)r[   r\   r]   r^   r   r1   floatr_   rs   r   r   r   r`   rN   r   r   rx   rx      sX    	sEz	
U

'
+{ +s +t ++# +$ +r   rx   c                 x   U (       d   e[        5       nU  Vs0 s H#  nU[        [        S5      [        S5      U5      _M%     nnX0S      R                  5         [	        S5       GHl  nUR
                  (       a    GOYSUl        [        X SS  S /-   5       GH6  u  p%X2   nUR                  [        ;  a?  Uc
   SU 35       e[        UR                  UR                  SS	9nX5   R                  Xg5        UR                  [        ;   aR  UR                  c
   S
U 35       eX2R                     R                  U[        UR                  UR                  SS	95        UR                  (       d  M  UR                  R                  [!        UR                  R"                  5      -   S-   nX2R                  R                     R%                  U5        GM9     GMo     ['        S UR)                  5        5       5      n	[+        S UR)                  5        5       5      n
UR
                  (       d   S5       eU	S:  d   eU
$ s  snf )Ninfz-infr   d   Tr   zmissing next inst: F)jumpzmissing target: c              3   8   #    U  H  oR                   v   M     g 7fr$   )rz   .0xs     r   	<genexpr>%stacksize_analysis.<locals>.<genexpr>  s     21ee1   c              3   8   #    U  H  oR                   v   M     g 7fr$   )r{   r   s     r   r   r     s     43!vv3r   zfailed to reach fixed point)rs   rx   r   r   r%   ru   r>   r*   r,   stack_effectargr   r+   r)   r(   r   r1   lastir   r   valuesr   )r    r|   r   stack_sizes_	next_inst
stack_sizeeffr   rz   r{   s              r   stacksize_analysisr      s   </K ! D 	ieeFm[AA    Q %%'3Z "<ab1ATF1JKOD$*J{{"22 ,J0CD6.JJ,"4;;uE&00A{{l*{{.I2B4&0II.KK(22T[[$(( N !!! **003t7I7I7O7O3PPSTT..556CCEJ  L , 2[//12
2C4{11344D;;;!8O8KCs   *H7))__doc__r5   dataclassesdisr2   typingr   r   r   bytecode_transformationr   opmapr,   r'   r3   r0   hasjrelhasjabsr+   r?   JUMP_OPNAMEShaslocalri   hasfreerj   r   listdictr1   r   r<   rD   rO   rT   	dataclassrV   rq   rs   rx   r   r   )r*   s   0r   <module>r      s     
 
 , ,  5 IInIInIIo    SYYy) *w?34>23?34
c((>23w#?@A3;;,-1=>v

6">s||
ckk
	tM* 	tM34F/G 	+K4#6 +K4;N +K\Nm)< NmAT N d=&9  d  m)<  $   ""}%""4A""X""J    + + +2$T-%8 $U3:=N $o ?s   (I)