ó
    Eñiþ#  ã                   óä  • S r SSK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\" \R0                  5      r\R4                  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"\RF                   " S S5      5       r$S\S   SSS\\   4S jr%\RF                   " S S 5      5       r&\RF                   " 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       Ú\/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torch/_dynamo/bytecode_analysis.pyÚget_indexofr   5   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_codeG   s—   ø€ Ü�uœc ,Ó/Ö0ˆAØ�I‹~ÙØ�M‰M˜!ÔØ ‘?ˆDØ×!×!Ù˜w t×'9Ñ'9×'@Ñ'@ÑAÔBØ�{‰{œlÓ*Ø—{‘{Ñ.Ð.Ð.Ù˜w t§{¡{Ñ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<   B   s]  û€ ä˜,Ó'€GÜ“€Iðœcð  d÷ ò ñ �1Ôô ×Ñ˜7Ó"Ü˜)Ó$ˆÜ  Ö.‰GˆAØ�I�~ $×"4×"4Ñ"4ä"×.Ò.Ø˜g d×&8Ñ&8×&>Ñ&>Ñ?ó�	ð !¤3 x£=Ó0Ð0Ð0ô ×'Ò'¨°'¸$×:LÑ:L×:PÑ:PÑ2QÓRÐUVÑVð ð  !“|Ð#�|ØÑ*¨aÕD°8Ñ3DÓDÐDÑDÐDÐDØ+7¸Ñ8KÑ+L�×"Ñ"Ô(Ø)5°hÑ6GÑ)H�×"Ñ"Ö&ñ /ô  !*¨,Ô 7ÔJÒ 7‘W�Q¸1À	¹>�DÑ 7ÒJÐJùÓJs   ÅE%ÅE%c                 ó  • [         R                  " U 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   )Ú	itertoolsÚpairwiseÚopnamer)   Úid)r    ÚaÚbÚpointless_jumpsr   s        r   Úremove_pointless_jumpsrE   p   s€   € ô ×&Ò& |Ô4ôâ4‰DˆAØ�8‰8�Ñ&ó 	à+,¯8©8°q¨=ó 	Œˆ1ŽÙ4ð ñ ñ
 *ÓMš\�T¬R°«X¸_Ñ-L�D™\ÑMÐMùóùò
 Ns   šA;´A;ÁA;ÁBÁ2B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    rL   r   rK   s      @r   Úpropagate_line_numsrP   z   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$   rH   rJ   s    €r   Úremove_line_numÚ/remove_extra_line_nums.<locals>.remove_line_numŽ   s3   ø€ à×ÑÑ#ØØ×Ñ Ó,Ø#ˆDÕà×*Ñ*‰Kr   rN   rO   )r    rS   r   rK   s      @r   Úremove_extra_line_numsrU   ‰   s#   ø€ ð €K÷+ó ˆÙ˜Öò r   c                   óF   • \ rS rSr% \\   \S'   \\   \S'   \\   \S'   Srg)ÚReadsWritesé›   ÚreadsÚwritesÚvisitedrO   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r0   r   Ú__annotations__Ú__static_attributes__rO   r   r   rW   rW   ›   s   ‡ àˆs‰8ƒOØ�‰HÓØ�‰XÖr   rW   Ú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 )r[   r'   r%   r&   r*   ÚHASLOCALÚHASFREEr@   ÚargvalrZ   rY   ÚNotImplementedErrorr(   r)   r+   r,   )	rd   r"   r   r   r   r    ÚmayÚmustÚwalks	       €€€€€r   rp   Úlivevars_analysis.<locals>.walk©   sC  ø€ Ø—M‘MÓ!ØØ�‰×Ñ˜%Ô ä�uœc ,Ó/×0ˆAØ ‘?ˆDØ�{‰{œhÓ&¨$¯+©+¼Ó*@Ø˜TŸ[™[Ó(¨H¸¿¹Ó,CØ—{‘{¨$¯+©+Ó5ØŸ™Ÿ™¨¯©Ô4øØ §¡Ó+Ø—L‘L×$Ñ$ T§[¡[Õ1Ø—[‘[ KÓ/Øä-°
¸4¿;¹;¸-Ð.HÓIÐIØ×!×!Ù�S˜' $×"4Ñ"4×";Ñ";Ñ<Ô=Ø�{‰{œlÓ*Ø—{‘{Ñ.Ð.Ð.Ù�S˜' $§+¡+Ñ.Ô/Ø�Ø�{‰{Ô.Ö.Ùò' 1r   )r   rW   r0   r1   rY   )r    rb   r   rn   ro   rp   s   ` @@@@r   Úlivevars_analysisrr   ¢   sz   ü€ ô ˜,Ó'€GÜ”s“uœc›e¤S£UÓ+€DÜ
”c“eœS›U¤C£EÓ
*€Cð”Kð ¬ð °÷ ó ñ4 	ˆˆw�{Ñ#Ô$Ø�:‰:˜Ÿ	™	Ñ!Ð!r   c                   ó$   • \ rS rSr% Sr\\S'   Srg)ÚFixedPointBoxéÇ   TÚvaluerO   N)r\   r]   r^   r_   rv   Úboolr`   ra   rO   r   r   rt   rt   Ç   s   ‡ à€Eˆ4Ör   rt   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)r{   r|   r}   rv   )Ú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©r{   r|   ÚminÚmaxr}   rv   )r   r‚   rƒ   Úpriors       r   Ú	offset_ofÚStackSize.offset_of×   sp   € Ø—‘˜4Ÿ9™9Ð%ˆÜ�t—x‘x §¡¨Q¡Ó/ˆŒÜ˜Ÿ	™	 5§:¡:°¡>Ó2ˆŒ	Ø�H‰H�d—i‘iÐ  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`   € Ø—‘˜4Ÿ9™9Ð%ˆÜ�t—x‘x Ó'ˆŒÜ˜Ÿ	™	 5Ó)ˆŒ	Ø�H‰H�d—i‘iÐ  EÓ)Ø%*ˆD×ÑÕ"ð *r   )r|   r{   )r   N)r\   r]   r^   r_   r   r1   Úfloatr`   rt   r€   rŠ   rŽ   ra   rO   r   r   ry   ry   Ì   sX   ‡ à	ˆs�EˆzÑ	ÓØ
��U�
Ñ
ÓØÓô'ð
+˜{ð +¨sð +°tô +ð+ #ð +¨$÷ +r   ry   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$   )r{   ©Ú.0Úxs     r   Ú	<genexpr>Ú%stacksize_analysis.<locals>.<genexpr>  s   é € Ð2Ò1˜�eŽeÒ1ùó   ‚c              3   ó8   #   • U  H  oR                   v •  M     g 7fr$   )r|   r–   s     r   r™   rš     s   é € Ð4Ò3˜!�vŽvÒ3ùr›   zfailed to reach fixed point)rt   ry   r�   r€   r%   rv   Úzipr*   r,   Ústack_effectÚargrŠ   r+   r)   r(   rŒ   r1   ÚlastirŽ   r‡   Úvaluesrˆ   )r    r}   r   Ústack_sizesÚ_Ú	next_instÚ
stack_sizeÚeffrŒ   r{   r|   s              r   Ústacksize_analysisr§   æ   s  € ÞÐˆ<Ü“/€Kñ !óâ ˆDð 	Œiœ˜e›¤e¨F£m°[ÓAÒAÙ ð ð ð ˜Q‘Ñ ×%Ñ%Ô'ä�3�ZˆØ××ÚØ ˆÔä" <¸a¸bÐ1AÀTÀFÑ1J×K‰OˆDØ$Ñ*ˆJØ�{‰{Ô"2Ó2Ø Ñ,ÐJÐ0CÀDÀ6Ð.JÓJÐ,Ü" 4§;¡;°·±¸uÑE�ØÑ&×0Ñ0°ÔAØ�{‰{œlÓ*Ø—{‘{Ñ.ÐIÐ2BÀ4À&Ð0IÓIÐ.ØŸK™KÑ(×2Ñ2Ø¤¨T¯[©[¸$¿(¹(ÈÑ Nôð ×!×!Ñ!ð ×*Ñ*×0Ñ0´3°t×7IÑ7I×7OÑ7OÓ3PÑPÐSTÑT�Ø×.Ñ.×5Ñ5Ñ6×CÑCÀE×Jô  Lñ ô, Ñ2˜[×/Ñ/Ô1Ó2Ó
2€CÜÑ4˜{×1Ñ1Ô3Ó4Ó4€Dà××Ð;Ð;Ó;ÐØ�!‹8€Oˆ8Ø€KùòCs   ˜*H7)*Ú__doc__r5   ÚdataclassesÚdisr>   r2   Útypingr   r   r   Úbytecode_transformationr   Úopmapr,   r'   r3   r0   ÚhasjrelÚhasjabsr+   r@   ÚJUMP_OPNAMESÚhaslocalrj   Úhasfreerk   rž   ÚlistÚdictr1   r   r<   rE   rP   rU   Ú	dataclassrW   rr   rt   ry   r�   r§   )r*   s   0r   Ú<module>r¶      s®  ðñó Û Û 
Û Û 
ß ,Ñ ,ö õ 5ð ‡I�IˆnÑØ‡I�IˆnÑØ‡I�IˆoÑðÐ ð × Ñ �S—Y‘Y˜yÑ)Ô *Ø×Ñ�wÓØ×Ñ˜Ÿ™ ?Ñ3Ô4Ø×Ñ˜Ÿ™ >Ñ2Õ3à×Ñ˜Ÿ™ ?Ñ3Ô4à
ˆc×ÑÕ( Ö(Ø×Ñ˜Ÿ™ >Ñ2Ô3Ø×Ñ�wÓØ×Ñ˜Ÿ™Ð#?Ñ@ÔAÙ�3—;‘; §¡Ñ,Ó-€Ù1=Ó>² v�—
‘
˜6Ô"±Ñ>€Ùˆs�|‰|Ó€Ù
ˆc�k‰kÓ
€à×Ñ€ð
�t˜MÑ*ð 
¨t°MÀ3Ð4FÑ/Gô 
ð+K 4¨Ñ#6ð +K¸4ÀÑ;Nô +Kð\N¨¨mÑ)<ð NÀÀmÑATô Nð  d¨=Ñ&9ð  ¸dô  ð¨¨mÑ)<ð Àô ð$ ×Ñ÷ð ó ðð""Ø�}Ñ%ð""Ø4Að""àˆ�Xô""ðJ ×Ñ÷ð ó ðð ×Ñ÷+ð +ó ð+ð2$ T¨-Ñ%8ð $¸UÀ3ÈÀ:Ñ=Nõ $ùòq ?s   Å,I-