+
    –°³jù�  ã                   óº  € ^ RI t ^ RIt^ RIHtHt ^ RIHtHt ^ RIH	t	H
t
HtHtHtHt ^ RIt^ RIt^ RIHtHt ^ RIHtHt ^ RIHt ^ RIHt ^ R	IHt ^ R
IHtHt ^RI H!t! ]! R4      t"]! R4      t#]$]PJ                  R3,          t&]$]']PP                  ,          ]']PJ                  ,          3,          t)]PT                  PW                  ],R4      t-^ RIH.t.H/t/ ]'       d   ^ RI0H1t1H2t2H3t3 R R lt4R R lt5R R lt6R R lt7R R lt8] Pr                  ! RR7       ! R R4      4       t:] Pr                  ! RR7       ! R  R!4      4       t;]R" R# l4       t<]R<R$ R% ll4       t<R<R& R' llt< ! R( R)4      t=R* R+ lt>R, R- lt?R. R/ lt@R0 R1 ltAR2 R3 ltB] Pr                  ! RR7       ! R4 R54      4       tC] Pr                  ! RR7       ! R6 R74      4       tDR8 R9 ltER: R; ltFR# )=é    N)ÚCounterÚdefaultdict)ÚCallableÚSequence)ÚAnyÚLiteralÚoverloadÚTYPE_CHECKINGÚTypeVarÚUnion)Úindex_vars_no_squeezeÚ
ReadWrites)Úsympy_productÚ
sympy_subs)Ú
OrderedSet)ÚIdentity)Ú	try_solve)Úsymbol_is_typeÚSymT©ÚVÚTÚU.Úloop_tiling)ÚFloorDivÚModularIndexing)ÚBaseSchedulerNodeÚFusedSchedulerNodeÚSchedulerNodec                óf   € V ^8„  d   QhR\         P                  R\         P                  R,          /# ©é   ÚexprÚreturnN©ÚsympyÚExpr)Úformats   "Ú]/home/luca/screen-checking/.venv/lib/python3.14/site-packages/torch/_inductor/tiling_utils.pyÚ__annotate__r*   (   s'   € ÷ ñ œŸ™ð ¬¯
©
°TÕ(9ñ ó    c                ój  € V P                  4       '       d   R# \        V \        4      '       d   R# \        V P                  4      ^8w  d"   \        R\        V P                  4       24      h\        \        V P                  4      4      p\        V \        4      '       dE   \        \        P                  ! V P                  ^ ,          V P                  ^,          4      V4      pM!\        \        P                  ! V ^ 4      V4      pV'       d   V^,          P                  4       '       g   R# V^,          # )zk
Given an expr with a single free symbol, solve for a constant relation that would make
this expression 0.
Nz$expected exactly 1 free symbol, got )Úis_constantÚ
isinstancer   ÚlenÚfree_symbolsÚAssertionErrorÚnextÚiterr   r   r&   ÚEqÚargs)r#   Úfree_symbolÚouts   &  r)   Úsolve_for_zeror8   (   sß   € ð
 ×Ñ×ÒÙÜ	�Dœ(×	#Ò	#Ùä
ˆ4×ÑÓ Ô"ÜØ2´3°t×7HÑ7HÓ3IÐ2JÐKó
ð 	
ô ”t˜D×-Ñ-Ó.Ó/€KÜ�$œ×(Ò(ÜœŸš §¡¨1¥¨t¯y©y¸­|Ó<¸kÓJ‰äœŸš  qÓ)¨;Ó7ˆß�c˜!•f×(Ñ(×*Ò*ÙØˆq�6€Mr+   c                óf   € V ^8„  d   QhR\         P                  R\         P                  R,          /# r!   r%   )r(   s   "r)   r*   r*   @   s+   € ÷ _ñ _œ5Ÿ:™:ð _¬%¯*©*°tÕ*;ñ _r+   c                ó  a€ \        V P                  4      ^8w  d   R# \        \        V P                  4      4      oR V3R llpV P	                  \
        4      '       g$   V P	                  \        4      '       g	   V! V 4      # . p. p\        P                  P                  V 4       Fž  p\        V\        P                  4      '       dk   RpVP                   FK  p\        V4      pVf   K  VP                  4       '       g   \        RV 24      hRpVP!                  V4       KM  	  V'       g    R# K�  VP!                  V4       K   	  V'       g   R# \#        V4      pR
R R llp	Tp
\%        ^4       F1  pV
P'                  \
        V	RR	7      P'                  \        V	RR	7      p
K3  	  V! V
4      pV'       d   \)        VSV/4      ^8w  d   R# VP!                  V4       \        \+        V4      4      ^8X  d
   V^ ,          # R# )a¨  
Giving an expr with a single free symbol, try to find a tiling that would
make the expression coalesced with respect to that symbol.

Tiling an expression `x` by `y` means that the expression will now be indexed
by both the original (x) and by (x * y). So we are looking for a
multiplicative factor that will make ((x + 1) * y) - (x * y) == 1.

To simplify things for sympy, we'll try just x * y == 1, check x(1) and x(0).
Nc                óf   € V ^8„  d   QhR\         P                  R\         P                  R,          /# r!   r%   )r(   s   "r)   r*   Ú&solve_for_tiling.<locals>.__annotate__Q   s'   € ÷ ñ ¤§¡ð ´·
±
¸TÕ0Añ r+   c                 óN  <€ V P                  \        4      '       g   V P                  \        4      '       d   R # \        V P                  4      ^8w  d   R # \        \        P                  ! V ^4      S4      pV'       d   V^,          P                  4       '       g   R # V^,          # ©N)	Úhasr   r   r/   r0   r   r&   r4   r-   )r#   r7   r6   s   & €r)   Ú_solve_simple_exprÚ,solve_for_tiling.<locals>._solve_simple_exprQ   ss   ø€ Ø�8‰8”O×$Ò$¨¯©´×(:Ò(:ñ Üˆt× Ñ Ó! QÔ&ÙäœŸš  qÓ)¨;Ó7ˆß˜#˜a�&×,Ñ,×.Ò.ÙØ�1�vˆr+   Fzexpected constant, got Tc                ó¦   € V ^8„  d   QhR\         P                  R\         P                  R\         P                  R,          R\         P                  /# )r"   ÚxÚyÚzNr$   r%   )r(   s   "r)   r*   r<   ‚   sE   € ÷ ñ Ü�:‰:ðä�:‰:ðô �:‰:˜Õðô 
�‰ñ	r+   c                 ó   € W,          # r>   © )rC   rD   rE   s   &&&r)   Úindexing_div_repÚ*solve_for_tiling.<locals>.indexing_div_rep‚   s   € ð
 �uˆr+   )Úsimultaneousr>   )r/   r0   r2   r3   r?   r   r   r&   ÚAddÚ	make_argsr.   ÚMulr5   r8   r-   r1   ÚappendÚsumÚrangeÚreplacer   r   )r#   r@   Úrequired_valuesÚeq_1_expressionsÚargÚseenÚmul_argr7   Ú	eq_1_exprrH   Úeq_1_expr_simplifiedÚ_r6   s   &           @r)   Úsolve_for_tilingrZ   @   sÅ  ø€ ô ˆ4×ÑÓ Ô"Ùä”t˜D×-Ñ-Ó.Ó/€K÷ð ð �8‰8”O×$Ò$¨T¯X©X´h×-?Ò-?Ù! $Ó'Ð'à€OØÐô
 �y‰y×"Ñ" 4Ö(ˆä�cœ5Ÿ9™9×%Ò%ØˆDàŸ8œ8�Ü$ WÓ-�Ø’;Ùà—‘×(Ò(Ü(Ð+BÀ3À%Ð)HÓIÐIØ�Ø×&Ñ& sÖ+ñ $÷ Úñ ð ×#Ñ# CÖ(ñ% )÷( ÙäÐ$Ó%€I÷ð %ÐÜ�1ŽXˆà3×;Ñ;ÜÐ-¸Eð  <ó  
ç
‰'”(Ð,¸5ˆ'Ó
Aò 	ñ ñ Ð1Ó
2€C÷ ”*˜Y¨°cÐ(:Ó;¸qÔ@Ùà×Ñ˜3Ôä
Œ:�oÓ&Ó'¨1Ô,Ø˜qÕ!Ð!ár+   c                ó¨   € V ^8„  d   QhR\         P                  R\        \         P                  \        3,          R\         P                  R,          /# ©r"   ÚindexÚ
var_rangesr$   N©r&   r'   ÚdictÚint)r(   s   "r)   r*   r*   ¢   s>   € ÷  ñ  Ü�:‰:ð Ü#'¬¯
©
´C¨Õ#8ð ä
‡Z�Z�$Õñ r+   c                ó:  € / pV P                    F  pW19   d   ^ W#&   K  \        V4      W#&   K  	  \        W4      pV F3  pW0P                   9  d   K  ^W#&    \        W4      pYT8X  d   Tu # ^ Y#&   K5  	  R#   \         d    \        P                  RY4        K]  i ; i)z°
Try to find the variable that this index is broadcast over.
A broadcast pattern is one where consecutive values of a variable
access the same memory location (e.g., x // 10).
úzero division error %s %sN)r0   Úget_hintr   ÚZeroDivisionErrorÚloop_tiling_logÚinfo)r]   r^   Ú	variablesÚvÚ
zero_indexÚnew_vals   &&    r)   Úfind_broadcast_varrl   ¢   s©   € ð *,€IØ×ÔˆØŒ?ØˆI‹Lä# A›;ˆI‹Lñ	  ô ˜EÓ-€JÛˆØ×&Ñ&Ô&Ùàˆ	‰ð	Ü  Ó2ˆGð
 Ô ØŠHØˆ	‹ñ ñ øô !ô 	Ü× Ñ Ð!<¸eÔOÚð	ús   ÁA5Á5!BÂBc                ó¨   € V ^8„  d   QhR\         P                  R\        \         P                  \        3,          R\         P                  R,          /# r\   r_   )r(   s   "r)   r*   r*   Å   s>   € ÷ #ñ #Ü�:‰:ð#Ü#'¬¯
©
´C¨Õ#8ð#ä
‡Z�Z�$Õñ#r+   c                ó¾  € \         P                  P                  V 4      pV F  pW29   g   K  Vu # 	  / pV P                   F  pW19   d   ^ WC&   K  \	        V4      WC&   K  	  \        W4      pV FC  p^WC&    \        W4      pYe,
          ^8X  d    ^YC&   \        Y4      T,
          ^8X  d   Tu # ^ YC&   KE  	  R#   \         d    \        P                  RY4        Km  i ; i)z3
Try to find the symbol which coalesces this index
rc   N)	r&   rK   rL   r0   rd   r   re   rf   rg   )r]   r^   Útop_level_termsri   rh   rj   rk   s   &&     r)   Úfind_coalesced_varrp   Å   så   € ô —i‘i×)Ñ)¨%Ó0€OÛˆØÖØŠHñ ð
 *,€IØ×ÔˆØŒ?ØˆI‹Lä# A›;ˆI‹Lñ	  ô ˜EÓ-€JÛˆØˆ	‰ð	Ü  Ó2ˆGð Õ 1Ô$ØˆI‰Lô ˜5Ó,¨wÕ6¸1Ô<Ø’Øˆ	‹ñ ñ øô !ô 	Ü× Ñ Ð!<¸eÔOÚð	ús   Á6B7Â7!CÃCc                óD   € V ^8„  d   QhR\         P                  R\        /# )r"   Úmemory_exprr$   )r&   r'   Úbool)r(   s   "r)   r*   r*   ë   s"   € ÷ Sñ S¤U§Z¡Zð S´Dñ Sr+   c                ó’   € \         ;QJ d&    R V P                   4       F  '       g   K   R# 	  R# ! R V P                   4       4      # )z<
Check if this memory expression has any indirect indexing.
c              3   óV   "  € T F  p\        V\        P                  4      x € K!  	  R # 5ir>   )r   r   ÚINDIRECT©Ú.0Úss   & r)   Ú	<genexpr>Ú&has_indirect_access.<locals>.<genexpr>ï   s    é € ÐRÑ9Q°AŒ~˜a¤§¡×/Ð/Ó9Qùs   ‚')TF)Úanyr0   )rr   s   &r)   Úhas_indirect_accessr}   ë   s9   € ÷ ‹3ÑR¸×9QÒ9QÓR�3Œ3ÐRŠ3ÐRˆ3ÑR¸×9QÒ9QÓRÓRÐRr+   T)Úfrozenc                   ó0   a € ] tR t^òt o RtV 3R ltRtV tR# )ÚFusedNormalizedReadsWriteszG
Normalized reads and writes for nodes in the same FusedSchedulerNode.
c                ó<  <€ V ^8„  d   Qh/ S[ S[P                  ,          ;R&   S[ S[P                  ,          ;R&   S[S[P                  S[ S[,          3,          ;R&   S[S[P                  S[ S[,          3,          ;R&   S[S[P                  S[3,          ;R&   # )r"   Ú
index_varsÚreduce_varsÚreadsÚwritesr^   )r   r&   ÚSymbolr`   r'   Ústrra   )r(   Ú__classdict__s   "€r)   r*   Ú'FusedNormalizedReadsWrites.__annotate__ò   sŠ   ø‡ ‚ ñ ™5Ÿ<™<Õ(Ñ(ñ ñ ™EŸL™LÕ)Ñ)ñ ñ ‘—
‘
™J¡s�OÐ+Õ,Ñ,ñ ñ ‘—‘™Z©�_Ð,Õ-Ñ-ñ ñ ‘U—\‘\¡3Ð&Õ'Ñ'ò r+   rG   N©Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__annotate_func__Ú__static_attributes__Ú__classdictcell__©rˆ   s   @r)   r€   r€   ò   ó   ø‡ € ñ÷ ƒ r+   r€   c                   ób   a € ] tR t^ÿt o V 3R lR ltV 3R lR ltV 3R lR ltV 3R ltRtV t	R	# )
Ú_FusedNodeViewc                ó.   <€ V ^8„  d   QhRS[ R,          /# )r"   r$   r   )r   )r(   rˆ   s   "€r)   r*   Ú_FusedNodeView.__annotate__  s   ø€ ÷ ñ ™8Ð$7Õ8ñ r+   c                ó   € V P                   # r>   )Únodes©Úselfs   &r)   Ú	get_nodesÚ_FusedNodeView.get_nodes  s   € Ø�z‰zÐr+   c                ó0   <€ V ^8„  d   QhRS[ S[,          /# ©r"   r$   ©r   r‡   )r(   rˆ   s   "€r)   r*   r˜     s   ø€ ÷ Sñ S¡*©S¥/ñ Sr+   c                óL   € \         P                  ! R  V P                   4       !  # )c              3   ó@   "  € T F  qP                  4       x € K  	  R # 5ir>   )Úget_buffer_names©rx   Únodes   & r)   rz   Ú2_FusedNodeView.get_buffer_names.<locals>.<genexpr>	  s   é € Ð!QÁj¸d×"7Ñ"7×"9Ð"9Ãjùó   ‚)r   Úunionrš   r›   s   &r)   r¤   Ú_FusedNodeView.get_buffer_names  s   € Ü×ÒÑ!QÀdÇjÂjÓ!QÑRÐRr+   c                ó0   <€ V ^8„  d   QhRS[ S[,          /# r    r¡   )r(   rˆ   s   "€r)   r*   r˜     s   ø€ ÷ Bñ B¡Z±¥_ñ Br+   c                ó:   € \        R  V P                   4       4      # )c              3   ó@   "  € T F  qP                  4       x € K  	  R # 5ir>   )Úget_namer¥   s   & r)   rz   Ú5_FusedNodeView.get_operation_names.<locals>.<genexpr>  s   é € ÐA±j¨dŸ-™-Ÿ/˜/³jùr¨   )r   rš   r›   s   &r)   Úget_operation_namesÚ"_FusedNodeView.get_operation_names  s   € ÜÑA°d·j²jÓAÓAÐAr+   c                óL   <€ V ^8„  d   Qh/ S[ R,          ;R&   S[;R&   S[;R&   # )r"   r   rš   Úread_writesÚgroup)r   r   r   )r(   rˆ   s   "€r)   r*   r˜   ÿ   s/   ø‡ ‚ áÐ'Õ(Ñ(ñ ñ Ññ ñ �Jò	 r+   rG   N)
r‹   rŒ   r�   rŽ   r�   r¤   r°   r�   r‘   r’   r“   s   @r)   r–   r–   ÿ   s.   ø‡ € ÷ð ÷Sð S÷Bð B÷ ƒ r+   r–   c                ó²   € V ^8„  d   QhRRR\         P                  R\         P                  R\        R,          R\        \        \        3,          R,          /# )	r"   Únr   Úpointwise_numelÚ	red_numelÚnone_if_not_divisibleTr$   N©r&   r'   r   ÚtupleÚVarsAndRanges)r(   s   "r)   r*   r*     sU   € ÷ 5ñ 5Øð5ä—Z‘Zð5ô �z‰zð5ô # 4�=ð	5ô
 Œ=œ-Ð'Õ(¨4Õ/ñ5r+   c                 ó   € R # r>   rG   ©r¶   r·   r¸   r¹   s   &&&&r)   Úget_pw_red_splitsr¿     s   € ñ 25r+   c                ó¤   € V ^8„  d   QhRRR\         P                  R\         P                  R\        R,          R\        \        \        3,          /# )r"   r¶   r   r·   r¸   r¹   Fr$   rº   )r(   s   "r)   r*   r*     sP   € ÷ .ñ .Øð.ä—Z‘Zð.ô �z‰zð.ô # 5�>ð	.ô
 Œ=œ-Ð'Õ(ñ.r+   c                 ó   € R # r>   rG   r¾   s   &&&&r)   r¿   r¿     s   € ñ +.r+   c                ó¤   € V ^8„  d   QhRRR\         P                  R\         P                  R\        R\        \        \        3,          R,          /# )r"   r¶   r   r·   r¸   r¹   r$   N)r&   r'   rs   r»   r¼   )r(   s   "r)   r*   r*   !  sQ   € ÷ /
ñ /
Øð/
ä—Z‘Zð/
ô �z‰zð/
ô  ð	/
ô
 Œ=œ-Ð'Õ(¨4Õ/ñ/
r+   c                 ó   € V P                  4       '       gU   \        P                  P                  P	                  \        V P                  P                  ^ ,          4      V4      '       dg   V P                  P                  V P                  P                  ^ ,          3V P                  P                  V P                  P                  ^,          33# \        \        V P                  P                  ^ ,          4      4      \        W,          4      8w  d   \        R4      h\        V P                  P                  ^ ,          4      ^,
          p^pV^ 8¼  d=   WPP                  P                  ^ ,          V,          ,          pWR8X  d   MV^,          pKC  V^ 8¼  dy   V P                  P                  ^ ,          ^ V pV P                  P                  ^ V pV P                  P                  ^ ,          VR pV P                  P                  VR p	Wv3W˜33# V'       d   R# V P                  P                  V P                  P                  ^ ,          3V P                  P                  V P                  P                  ^,          33# )r   z=expected pointwise sizes to match pointwise_numel * red_numelN)Úis_reductionr   ÚgraphÚsizevarsÚstatically_known_equalsr   Ú_bodyÚsizesÚ	iter_varsrƒ   rd   r1   r/   )
r¶   r·   r¸   r¹   ÚiÚprodÚ	pw_splitsrÊ   Ú
red_splitsÚred_varss
   &&&&      r)   r¿   r¿   !  sê  € ð 	‡~�~×Òœ1Ÿ7™7×+Ñ+×CÑCÜ�a—g‘g—m‘m AÕ&Ó'¨÷ò ð
 �W‰W×Ñ §¡§¡¨aÕ 0Ð1Ø�W‰W× Ñ  !§'¡'§-¡-°Õ"2Ð3ð
ð 	
ô
 ”˜aŸg™gŸm™m¨AÕ.Ó/Ó0´HØÕ#ó5ô ô ØKó
ð 	
ô 	ˆA�G‰G�M‰M˜!ÕÓ Õ!€AØ€DØ
ˆqŒ&Ø—‘—‘˜aÕ  Õ#Õ#ˆØÔØØ	ˆQ�ŠàˆA„vØ—G‘G—M‘M !Õ$ Q qÐ)ˆ	Ø—G‘G×%Ñ% a¨Ð*ˆ	à—W‘W—]‘] 1Õ% a bÐ)ˆ
Ø—7‘7×$Ñ$ Q RÐ(ˆØÐ%¨Ð'=Ð=Ð=çÙð �W‰W×Ñ §¡§¡¨aÕ 0Ð1Ø�W‰W× Ñ  !§'¡'§-¡-°Õ"2Ð3ð
ð 	
r+   c                   óZ   a € ] tR tRt o RtV 3R lR ltV 3R lR ltV 3R lR ltR	tV t	R
# )ÚNodeSplitGetteriS  zW
Finds a Pointwise, Reduction Split that compatible with all nodes in a SchedulerNode.
c                ó.   <€ V ^8„  d   QhRS[ R,          /# )r"   r¦   ©r–   r   r   )r   )r(   rˆ   s   "€r)   r*   ÚNodeSplitGetter.__annotate__X  s   ø€ ÷ />ñ />áÐKÕLñ/>r+   c                ó¸  € Wn         VP                  ^,          ^ ,          V n        VP                  ^,          ^,          V n        \	        \
        4      V n        \	        \
        4      V n        RV n        \        4       V n	        VP                  ^,          p\        VP                  4       4       EF—  p\        V\        P                  P                  P                   4      '       g   K:  \#        W0P                  V P                  RR7      pVf2   V P                  P%                  VP&                  P(                  4       K‘  Vw  w  rVw  rW\        P                  P*                  P,                  P.                  P1                  W&V3V P                  4      w  rgV P                  \3        V4      ,          P%                  \5        V4      4       V P                  \3        V4      ,          P%                  \5        V4      4       VR8w  d   \7        V4      3V n        \5        V4      \5        V4      3pV P                  P%                  V4       EKš  	  \        4       V n        R# )é   T)r¹   NrG   )r¦   r´   r·   r¸   r   r   Úpw_split_optionsÚred_split_optionsÚreduction_splitÚall_node_sizesÚreversedr�   r.   ÚtorchÚ	_inductorÚ	schedulerr   r¿   ÚaddrÈ   rÉ   ÚcodegenÚsimdÚ
SIMDKernelÚprepare_split_iteration_lengthsr/   r»   r   Úseen_pw_splits)	rœ   r¦   Úfused_groupr¶   Úmaybe_splitsrY   Ún_pw_splitsÚn_red_splitsÚn_sizes	   &&       r)   Ú__init__ÚNodeSplitGetter.__init__X  sÅ  € ð Œ	Ø+/¯:©:°a­=¸Õ+;ˆÔØ%)§Z¡Z°¥]°1Õ%5ˆŒä>IÌ*Ó>UˆÔÜ?JÌ:Ó?VˆÔà&(ˆÔÜ?I»|ˆÔà—j‘j •mˆÜ˜$Ÿ.™.Ó*×+ˆAÜ˜a¤§¡×!:Ñ!:×!HÑ!H×IÒIÙô
 -Ø×'Ñ'¨¯©ÈtôˆLð Ò#Ø×#Ñ#×'Ñ'¨¯©¯©Ô6Ùà2>Ñ/ÑˆQÑ/˜qô —‘×'Ñ'×,Ñ,×7Ñ7×WÑWØ¨|Ð!<¸d¿n¹nóñ &ˆKð ×!Ñ!¤# kÓ"2Õ3×7Ñ7¼¸kÓ8JÔKØ×"Ñ"¤3 |Ó#4Õ5×9Ñ9¼%ÀÓ:MÔNà˜rÔ!Ü(5°lÓ(CÐ'E�Ô$ä˜KÓ(¬%°Ó*=Ð>ˆFØ×Ñ×#Ñ# F×+ñ= ,ô@ 2<³ˆÖr+   c                ó6   <€ V ^8„  d   QhRS[ S[S[3,          /# r    )r»   ÚSplit)r(   rˆ   s   "€r)   r*   rÔ   ‰  s   ø€ ÷ (<ñ (<¡¡u©e |Õ!4ñ (<r+   c                ó:  € \        V P                  4      ^8X  d   \        \        V P                  4      4      # \        V P                  4      ^ 8X  d   V P
                  3V P                  33# \        V P                  P                  4       4      p\        V P                  P                  4       4      pR R lpW,           p\        \        V^ R4      4       F¨  w  rV\        V^ R4       F`  pV P                  V,           FF  pV P                  Wg,
          ,           F&  p	V P                  W‰4      ;p
'       g   K  V
u u u u # 	  KH  	  Kb  	  V! V P                  W,
          4       V! V P                  W%,
          4       Kª  	  V P
                  3V P                  33# )z9
Get a compatible pointwise, reduction split of the node
c                ól   € V ^8„  d   QhR\         \        \        \        ,          3,          R\        RR/# )r"   Úsplit_optionsÚcurr_lengthr$   N)r`   ra   r   rí   )r(   s   "r)   r*   Ú5NodeSplitGetter.get_node_splits.<locals>.__annotate__—  s8   € ÷ 	Añ 	AÜ¤¤Z´Õ%6Ð 6Õ7ð	AÜFIð	Aàñ	Ar+   c                 ó  € W,           F~  p\        \        V4      ^,
          4       F\  p\        V^ V \        W#V^,            4      3,           W#^,           R ,           4      pV \        V4      ,          P	                  V4       K^  	  K€  	  R# )rÖ   N)rP   r/   r»   r   rß   )rð   rñ   ÚsplitrË   Ú	new_splits   &&   r)   Úadd_combined_split_optionsÚCNodeSplitGetter.get_node_splits.<locals>.add_combined_split_options—  s}   € ð '×3Ð3�Üœs 5›z¨A�~Ö.�AÜ %Ø˜a ˜
¤m°E¸aÀ!½eÐ4DÓ&EÐ%GÕGÈ%ÐTUÕPUÐPWÈ.ÕXó!�Ið "¤# i£.Õ1×5Ñ5°iÖ@ó	 /ó 4r+   éÿÿÿÿ)r/   rÚ   r2   r3   r×   r·   r¸   ÚmaxÚkeysrØ   Ú	enumeraterP   Ú	try_split)rœ   Úmax_pw_splitÚmax_red_splitrö   Úmax_total_splitsÚ	curr_iterÚtotal_splitsÚpw_split_lenÚpw_splitÚ	red_splitr7   s   &          r)   Úget_node_splitsÚNodeSplitGetter.get_node_splits‰  so  € ô
 ˆt×"Ñ"Ó# qÔ(Üœ˜T×0Ñ0Ó1Ó2Ð2äˆt×$Ñ$Ó%¨Ô*Ø×)Ñ)Ð+¨d¯n©nÐ->Ð?Ð?ä˜4×0Ñ0×5Ñ5Ó7Ó8ˆÜ˜D×2Ñ2×7Ñ7Ó9Ó:ˆõ	Að (Õ7ÐÜ'0´Ð7GÈÈBÓ1OÖ'PÑ#ˆIÜ % l°A°rÖ :�Ø $× 5Ñ 5°l× CÐ C�HØ%)×%;Ñ%;Ø$Õ3÷&ð &˜	ð #'§.¡.°Ó"EÐE˜3×EÐEØ#&ŸJ˜Jó	&ó !Dñ !;ñ ' t×'<Ñ'<¸lÕ>VÔWÙ&Ø×&Ñ&¨Õ(Aöñ (Qð ×%Ñ%Ð'¨$¯.©.Ð):Ð;Ð;r+   c                óP   <€ V ^8„  d   QhRS[ RS[ RS[S[ S[ 3,          R,          /# )r"   ÚpwÚredr$   N)rí   r»   )r(   rˆ   s   "€r)   r*   rÔ   ³  s0   ø€ ÷  ñ  ™Eð  ©ð  ±%¹¹u¸Õ2EÈÕ2Lñ  r+   c                óü  € ^ RI HpHp WP                  9   d   R# V P                  P	                  V4       V P
                   F¦  w  rV W,           pWV3pVP                  Wx4      w  rš\        T
4      ^8w  d   \        R\        T
4       24      hT	R\        T4       p\        \        P                  P                  T4      4      pYÁ8w  g   K‰  T P                  YÂ4      ;p'       g   K¤  Tu # 	  W3#   T d      R# i ; i)z[
See if this split is compatible, and potentially returning a longer split
than the input.
)Ú	CantSplitrâ   Nzexpected 2 getters, got )Útorch._inductor.codegen.simdr  râ   rä   rß   rÚ   Ú_split_iteration_rangesr/   r1   r»   Ú	itertoolsÚchainÚfrom_iterablerü   )rœ   r  r	  r  râ   Ún_pwÚn_redÚgroupsÚlengthsÚsplitsÚgettersÚpw_group_splitsÚflattened_pw_splitsr7   s   &&&           r)   rü   ÚNodeSplitGetter.try_split³  só   € ÷ 	Gà×$Ñ$Ô$ÙØ×Ñ×Ñ Ô#à×.Ô.‰KˆDðØ��Ø˜-�Ø",×"DÑ"DÀVÓ"U‘�ô �7‹|˜qÔ Ü$Ð'?ÄÀGÃ¸~Ð%NÓOÐOØ$ Y¤s¨2£wÐ/ˆOô
 #(¬	¯©×(EÑ(EÀoÓ(VÓ"WÐØ"Ö(ØŸ.™.Ð)<ÓBÐB�3×BÐBØ’Jñ% /ð( ˆwˆøð ô Ûðús   ÁC/Ã/C;Ã:C;)rÚ   r¦   r·   r×   r¸   rØ   rÙ   rä   N)
r‹   rŒ   r�   rŽ   r�   rê   r  rü   r‘   r’   r“   s   @r)   rÑ   rÑ   S  s*   ø‡ € ñ÷/>ð />÷b(<ð (<÷T ö  r+   rÑ   c                ó,  € V ^8„  d   QhR\         \        P                  ,          R\         \        P                  ,          R\         \        P                  ,          R\         \        P                  ,          R\         \         \        P                  ,          ,          R\         \         \        \         \        P                  ,          .\        P                  3,          ,          ,          R\
        \        P                  \        P                  3,          /# )r"   rÊ   rÏ   Únorm_pw_varsÚnorm_red_varsÚ
new_rangesÚreturn_getters_groupsr$   )Úlistr&   r†   r'   r   r`   )r(   s   "r)   r*   r*   Ö  s¿   € ÷ Jñ JÜ”E—L‘LÕ!ðJä”5—<‘<Õ ðJô ”u—|‘|Õ$ðJô œŸ™Õ%ð	Jô
 ”Tœ%Ÿ*™*Õ%Õ&ðJô  ¤¤X¬t´E·J±JÕ/?Ð.@Ä%Ç*Á*Ð.LÕ%MÕ NÕOðJô 
Œ%�,‰,œŸ
™
Ð
"Õ#ñJr+   c           	     óº  € \        R V 4       4      p\        P                  ! RV 24      p^ p\        V 4      ^ 8X  d   \        V4      ^ 8X  d   / # \        V4      \        W#,           4      8w  d*   \	        R\        V4       R\        W#,           4       24      h. p	V F)  p
T	P                  V
 Uu. uF
  q»! V4      NK  	  up4       K+  	  / p\        \        W�V3RR7      4       F�  w  pw  r®\        V
4      \        V4      8w  d?   V^8w  d   \	        RV 24      h\        V4      ^ 8w  d   \	        R\        V4       24      hK_  TP                  \        W®4       UUu/ uF  w  r¿WûbK	  	  upp4       K�  	  ^ p/ p\        WBV,           RR7       FŒ  w  pp. p\        \        V4      4       F#  pVP                  Wx,          4       V^,          pK%  	  ^p\        \        V4      ^,
          R	R	4       F&  pVV,          VVV,          &   VV,          V,          pK(  	  KŽ  	  VP                  4        UUu/ uF  w  ppV\        VV4      bK  	  upp# u upi u uppi u uppi )
zBMaps original variables to expressions using normalized variables.c              3   ó8   "  € T F  p\        V4      x € K  	  R # 5ir>   )r/   rw   s   & r)   rz   Ú$apply_var_mapping.<locals>.<genexpr>í  s   é € Ð.¡:˜a”3�q—6�6£:ùs   ‚zv_0:zCexpected len(new_ranges) == len(norm_pw_vars + norm_red_vars), got z and T©Ústrictzexpected i == 1, got z"expected empty var_group, got len rø   )rO   r&   Úsymbolsr/   r1   rN   rû   ÚzipÚupdaterP   Úitemsr   )rÊ   rÏ   r  r  r  r  Únum_varsÚ	flat_varsÚcountÚapply_groupsr´   ÚgÚiter_vars_to_flat_varsrË   Ú	var_groupri   Úflat_vars_to_new_varsÚ	new_rangeÚnew_varÚ
range_varsrY   rÌ   Úks   &&&&&&                 r)   Úapply_var_mappingr5  Ö  s`  € ô. Ñ.¡:Ó.Ó.€HÜ—’  X JÐ/Ó0€IØ€Eä
ˆ9ƒ~˜Ôœs 8›}°Ô1Øˆ	ä
ˆ:ƒœ#˜lÕ:Ó;Ô;ÜðÜ�z“?Ð# 5¬¨\Õ-IÓ)JÐ(KðMó
ð 	
ð €LÛ&ˆØ×Ñ±5Ó9±5¨a˜Q˜yž\±5Ñ9Ö:ñ 'ð  ÐÜ!*ÜˆL hÐ/¸Ô=ö"ÑˆÑˆEô
 ˆu‹:œ˜Y›Ô'Ø�AŒvÜ$Ð'<¸Q¸CÐ%@ÓAÐAÜ�9‹~ Ô"Ü$Ø8¼¸Y»Ð8HÐIóð ñ à×%Ñ%¼¸EÔ8MÔ&NÑ8M±° q¢tÑ8MÒ&NÖOñ"ð  €EØÐÜ!Ø =Õ0¸÷Ñˆ	�7ð ˆ
Ü”s˜9“~Ö&ˆAØ×Ñ˜iÕ.Ô/Ø�Q�JŠEñ 'ð ˆÜ”s˜9“~¨Õ)¨2¨rÖ2ˆAØ3:¸Tµ>Ð! *¨Q¥-Ñ0Ø˜Q•< $Õ&ŠDó 3ñð +×0Ñ0Ô2ôá2‰DˆAˆqð 	
Œ:�aÐ.Ó/Ò/Ù2òð ùòE :ùó" 'Oùó"s   Â.I
ÅIÈ/Ic                óL   € V ^8„  d   QhR\         R,          R\        R,          /# )r"   r¦   r$   NrÓ   )r   r€   )r(   s   "r)   r*   r*   #  s+   € ÷ zñ zÜ
ÐGÕ
Hðzä $Õ&ñzr+   c           
     ó
  a*€ \        \        4      p\        \        4      pV P                  4       pV P                  4       p\        4       p\        4       o*V FV  p\        P
                  P                  P                  Wd4      '       d   S*P                  V4       KE  VP                  V4       KX  	  \        V*3R lV P                  P                   4       4      pV P                  ^,          ^ ,          pV P                  ^,          ^,          p	\        V 4      P                  4       w  r«\        W«RR7      w  w  rÍp\        V P!                  4       4       EFh  p\#        V\$        P&                  P                  P(                  4      '       g   K:  VP*                  p\        \        4      p\        \        4      pV F3  pVP-                  V4       F  pVV,          P                  V4       K  	  K5  	  V F3  pVP/                  V4       F  pVV,          P                  V4       K  	  K5  	  V'       g   V'       g   Kè  \1        WøV	4      w  w  ppw  ppW«,           pVV3p\$        P&                  P2                  P4                  P6                  P9                  VVV	4      p \$        P&                  P2                  P4                  P6                  P;                  VV4      w  pp\C        TTTTTT4      pR R lp TPE                  4        U!U"u/ uF  w  p!p"\G        T ! T!4      T4      T"bK  	  p#p!p"TPE                  4        U$U"u/ uF  w  p$p"\G        T ! T$4      T4      T"bK  	  p%p$p"T#PE                  4        F  w  pp&TT;;,          T&,          uu&   K  	  T%PE                  4        F  w  pp&TT;;,          T&,          uu&   K  	  EKk  	  VPE                  4        U'U"u/ uF1  w  p'p"\        P
                  PH                  PK                  V'V4      V"bK3  	  pp'p"VPE                  4        U(U"u/ uF1  w  p(p"\        P
                  PH                  PK                  V(V4      V"bK3  	  pp(p"\M        VVVVV4      p)\N        PQ                  RV)4       V)#   \$        P&                  P2                  P4                  P<                   d=   pTP>                  '       g   T	P>                  '       g   \A        R4      Th Rp? R# Rp?ii ; iu up"p!i u up"p$i u up"p'i u up"p(i )	zjExtracts index variables, reduce variables, read/write expressions, and variable ranges from a fused node.c              3   ó`   <"  € T F#  qP                   S9  g   K  VP                   x € K%  	  R # 5ir>   )Úname)rx   ÚdepÚremoved_bufferss   & €r)   rz   Ú1extract_normalized_read_writes.<locals>.<genexpr>4  s$   øé € ð Ù2�S·h±hÀoÑ6UŒˆ�ŽÓ2ùs   ƒ.š.r¶   )Úprefixz7expected dynamic shapes (free symbols) when split failsNc                óX   € V ^8„  d   QhR\         P                  R\         P                  /# )r"   r#   r$   r%   )r(   s   "r)   r*   Ú4extract_normalized_read_writes.<locals>.__annotate__}  s"   € ÷ 	7ñ 	7¤%§*¡*ð 	7´·±ñ 	7r+   c                 ó0   € V P                  \        R  4      # )c                 ó   € V # r>   rG   )rC   s   &r)   Ú<lambda>ÚIextract_normalized_read_writes.<locals>.remove_identity.<locals>.<lambda>~  s   € ±Ar+   )rQ   r   )r#   s   &r)   Úremove_identityÚ7extract_normalized_read_writes.<locals>.remove_identity}  s   € Ø—<‘<¤©+Ó6Ð6r+   zNormalized Fused reads: %s))r   r   r¤   r°   r   rÅ   rÞ   Ú$can_buffer_be_removed_through_fusionrß   r³   r„   r´   rÑ   r  r   r  r�   r.   rÜ   rÝ   r   rÈ   Úget_all_read_exprÚget_all_write_exprr¿   rà   rá   râ   rã   r  r  r0   r1   r5  r(  r   rÆ   Úsimplify_with_rangesr€   rf   rg   )+r¦   r„   r…   Úall_output_namesÚop_namesÚoutputsÚbuf_nameÚinputsr·   r¸   rÍ   rÎ   r  r  Úrangesr¶   ÚbodyÚn_readsÚn_writesÚinpr#   r7   rÊ   rç   rÏ   rè   r  r  r  r  ÚeÚvar_maprD  Úreadri   Ún_reads_newÚwriteÚn_writes_newÚ	buf_namesÚrÚwÚ	fused_outr;  s+   &                                         @r)   Úextract_normalized_read_writesr^  #  sv  ø€ ô 0;¼:Ó/F€EÜ0;¼JÓ0G€Fà×,Ñ,Ó.ÐØ×'Ñ'Ó)€HÜ)›|€GÜ'1£|€OÛ$ˆÜ�7‰7×Ñ×AÑAÀ(×UÒUØ×Ñ Ö)à�K‰K˜Ö!ñ	 %ô ô Ø ×,Ñ,×2Ò2óó €Fð #'§*¡*¨Q¥-°Õ"2€OØ ŸJ™J q�M¨!Õ,€Iä+¨DÓ1×AÑAÓCÑ€Iô -BØ cô-Ñ)Ñ!€\ 6ô �$—.‘.Ó"×#ˆÜ˜!œUŸ_™_×6Ñ6×DÑD×EÒEÙà�w‰wˆä5@ÄÓ5LˆÜ6AÄ*Ó6Mˆó ˆCØ×.Ñ.¨sÖ3�Ø˜•×!Ñ! #Ö&ó 4ñ ó ˆCØ×/Ñ/°Ö4�Ø˜•×"Ñ" 3Ö'ó 5ñ ÷ ŸxÙä=NØ 	ó>
Ñ:Ñ ˆ�KÑ": 8¨\ð Õ'ˆØ Ð/ˆä�O‰O×#Ñ#×(Ñ(×3Ñ3×SÑSØ˜ óð 	ð
	ä—‘×'Ñ'×,Ñ,×7Ñ7×OÑOØ˜Góñ .ˆJÐ-ô $ØØØØØØ!ó
ˆõ	7ð JQÏÉÌô
ÙIX¹g¸dÀAŒJ‘ tÓ,¨gÓ6¸Ò9Éð 	ñ 
ð
 %ŸN™NÔ,ô
á,‘��qô ‘ uÓ-¨wÓ7¸Ò:Ù,ð 	ñ 
ð
  +×0Ñ0Ö2‰OˆD�)Ø�$�K˜9Õ$�Kñ  3ð  ,×1Ñ1Ö3‰OˆD�)Ø�4�L˜IÕ%�Lô  4ñS $ðZ INÏÉÌôÙHUÁÀÀ1Œ�‰×Ñ×-Ñ-¨a°Ó8¸!Ò;Éð 
ñ ð IOÏÉÌôÙHVÁÀÀ1Œ�‰×Ñ×-Ñ-¨a°Ó8¸!Ò;Éð ñ ô +ØØØØØó€Iô ×ÑÐ5°yÔAØÐøôi �‰×&Ñ&×+Ñ+×5Ñ5ô 	ð $×0×0Ð0°I×4J×4JÐ4JÜ$ØMóàðö ûð	üó.
ùó
ùóùós7   ÊARÌS3Ì;S9Ï7S?Ð 7TÒ3S0Ò4#S+ÓS+Ó+S0c                ó¨   € V ^8„  d   QhR\         P                  R\        \         P                  \        3,          R\
        \        ,          R\        /# )r"   Úaddrr^   rZ  r$   )r&   r'   r`   r†   ra   r   r‡   )r(   s   "r)   r*   r*      sI   € ÷ Hñ HÜ
�*‰*ðHÜ"&¤u§|¡|´SÐ'8Õ"9ðHÜFPÔQTÅoðHäñHr+   c                ó(  € . pV P                    FM  pVP                  V4      p\        V\        P                  4      '       d   K6  Vf   K<  VP                  V4       KO  	  ^RIHp VP                  P                  P                  \        V4      4      # )z/
Score addr according to its approximate size.
r   )r0   Úgetr   r   rv   rN   Úvirtualizedr   rÅ   rÆ   Úoptimization_hintr   )r`  r^   rZ  Ú	var_sizesri   Úv_sizer   s   &&&    r)   Ú	get_scorerg     sp   € ð €IØ×ÔˆØ—‘ Ó"ˆä˜a¤§¡×/Ô/°FÔ4FØ×Ñ˜VÖ$ñ	 õ
 à�7‰7×Ñ×-Ñ-¬m¸IÓ.FÓGÐGr+   c                ó>   € V ^8„  d   QhR\         R\        R,          /# )r"   rM  r$   N)r‡   ra   )r(   s   "r)   r*   r*   ²  s"   € ÷ Mñ Mœsð M¤s¨T¥zñ Mr+   c                 óÔ   € \         P                  P                  V 4      pV'       g   R # \         P                  P                  P	                  \        VP                  4       4      4      # r>   )r   rÅ   Útry_get_bufferrÆ   rd  r   Úget_size)rM  Úbufs   & r)   Útry_get_buf_sizerm  ²  sB   € Ü
�'‰'×
 Ñ
  Ó
*€CßÙÜ�7‰7×Ñ×-Ñ-¬m¸C¿L¹L»NÓ.KÓLÐLr+   c                óZ   € V ^8„  d   QhR\         P                  \        ,          R\        /# )r"   ri   r$   )r&   r'   ra   )r(   s   "r)   r*   r*   ¹  s#   € ÷ 5ñ 5”—
‘
œSÕ ð 5¤Sñ 5r+   c                 ó„   € \        V \        4      '       d   V # \        P                  P                  P                  V 4      # r>   )r.   ra   r   rÅ   rÆ   rd  )ri   s   &r)   rd   rd   ¹  s/   € Ü�!”S×ÒØˆä�w‰w×Ñ×1Ñ1°!Ó4Ð4r+   c                   ó0   a € ] tR tRt o RtV 3R ltRtV tR# )Ú	VarTilingiÀ  ze
Tiling of a var by `tiling_factor` that yields additional coalesced mem accesses by `benefit_score`
c                óR   <€ V ^8„  d   Qh/ S[ P                  ;R&   S[;R&   S[;R&   # )r"   ÚvarÚtiling_factorÚscore)r&   r†   ra   )r(   rˆ   s   "€r)   r*   ÚVarTiling.__annotate__À  s/   ø‡ ‚ ñ 
�‰Ññ ñ Ññ ñ �Jò r+   rG   NrŠ   r“   s   @r)   rq  rq  À  r”   r+   rq  c                   ó0   a € ] tR tRt o RtV 3R ltRtV tR# )ÚCoalesceVarAnalysisiË  Nc                ó¬   <€ V ^8„  d   Qh/ S[ S[P                  S[3,          ;R&   S[ S[P                  S[3,          ;R&   S[;R&   S[R,          ;R&   # )r"   Úcoalesced_by_varÚuncoalesced_addrsÚnorm_read_writesNÚsuggested_split)r`   r&   r'   ra   r€   rq  )r(   rˆ   s   "€r)   r*   Ú CoalesceVarAnalysis.__annotate__Ë  sX   ø‡ ‚ ñ
 ™5Ÿ:™:¡s˜?Õ+Ñ+ñ ñ ™EŸJ™J©˜OÕ,Ñ,ñ ñ 1Ñ0ñ ñ  Õ%Ñ,ò r+   rG   )r‹   rŒ   r�   rŽ   r}  r�   r‘   r’   r“   s   @r)   rx  rx  Ë  s   ø‡ € ð )-€O÷ ƒ r+   rx  c                óL   € V ^8„  d   QhR\         R,          R\        R,          /# )r"   Ú
fused_noder$   NrÓ   )r   rx  )r(   s   "r)   r*   r*   Ù  s+   € ÷ }ñ }ÜÐMÕNð}ä˜4Õñ}r+   c           
     ó

  a(€ \        V 4      pVf   R# VP                  pVP                  pVP                  p\	        4       p\	        4       pVP
                  pVP                  pV'       d   V'       g   \        \        V4      4      MRp	\        P                  ! R VP                  4        4       R VP                  4        4       4       EF�  w  p
w  r¼\        W´V4      pV^ 8X  d   K  \        V4      pV'       d   RpM\        W´4      pVf   \        W´4      p^ pV Fo  p\         P"                  P%                  V4      ;p'       g   K,  \'        V4      ;p'       g   KA  V\)        VV4      VP*                  P,                  ,          ,          pKq  	  TV
'       d   ^M^,          pV'       dª   RpV	en   Wù8w  dh   \.        P1                  V^ 4      p \3        VV4      p^VV	&   \3        VV4      pVV,
          pVR	9   d$   ^VV	&   \3        VV4      pVV,
          pVR	9   d   RpV'       g   W_;;,          V,          uu&   EKr  WY;;,          V,          uu&   EK‰  Wk;;,          V,          uu&   EK   	  V'       g   \9        VVVR7      # \;        \        4      pVP                  4        EF¨  w  pp\        V4      '       d   K  \.        P1                  VP=                  4       ^ 4      pVP>                  VP=                  4       ,           EFD  pVV9  d   K  V^ 8X  d   K  VV \3        VV4      p ^ VV&   \A        V P>                  4      ^8w  d   KF  \C        V 4      p!V!e)   V!PE                  4       '       d   V!PF                  '       g   K  \I        V!4      p!\         P"                  PJ                  PM                  V!VV,          4      '       g   KÃ  ^o(\N        ;QJ d/    V(3R lV!VV,          V!,          3 4       F  '       d   K   RM$	  RM ! V(3R lV!VV,          V!,          3 4       4      '       g   EK(  VV,          V!;;,          V,          uu&   EKG  	  EK«  	  \A        V4      ^ 8X  d   \9        VVVR7      # Rp"^ p#VP                  4        F/  w  p$p%V%P                  4        F  w  p&p'V'V#8”  g   K  V$V&3p"T'p#K  	  K1  	  V"f   \9        VVVR7      # \9        VVV\Q        V"^ ,          V"^,          V#4      R7      #   \4        \6        3 d     ELäi ; i)
aÅ  
Implementation for BaseSchedulerNode.get_coalesce_analysis().
Call that node method so loop-transform cache invalidation is honored.

Find variables that coalesce the reads and writes and score the total size.

If uncoalesced memory expressions are found, look for additionally tiling of variables
which will coalesce memory accesses.

For instance - for the following expression:

(32*p0) // 2048

Tiling p0 by 64 will make this expression coalesced.
Nc              3   ó*   "  € T F	  pR V3x € K  	  R# 5i)TNrG   ©rx   Úitems   & r)   rz   Ú-_analyze_memory_coalescing.<locals>.<genexpr>   s   é € Ð0¡-˜$ˆ$��£-ùó   ‚c              3   ó*   "  € T F	  pR V3x € K  	  R# 5i)FNrG   rƒ  s   & r)   rz   r…    s   é € Ð2¡>˜4ˆ%��£>ùr†  FT)rz  r{  r|  c              3   óx   <"  € T F/  p\         P                  P                  P                  SV4      x € K1  	  R # 5ir>   )r   rÅ   rÆ   Ústatically_known_lt)rx   ÚblockÚMIN_TILING_BLOCKs   & €r)   rz   r…  n  s3   øé € ð áL�Eô —‘× Ñ ×4Ñ4Ð5EÀu×MÐMÛLùs   ƒ7:)rz  r{  r|  r}  )r   rÖ   ))r^  r„   r…   r^   r   r‚   rƒ   r2   rÛ   r  r  r(  rg  r}   rp   rl   r   rÅ   rj  rm  ÚminÚdtypeÚitemsizer`   Úfromkeysr   re   Ú	TypeErrorrx  r   rú   r0   r/   rZ   r-   Ú
is_integerra   rÆ   r‰  Úallrq  ))r€  r|  r„   r…   r^   rz  r{  r‚   rƒ   Úinnermost_varÚis_readrr   rZ  ÚsizeÚindirect_exprÚmaybe_coalesced_varÚtotal_scorerM  rl  Úbuf_sizeÚalready_coalesced_1dÚsubsÚval_0Úval_1Ú	stride_01Úval_2Ú	stride_12Útiling_scoresÚuncoalesced_exprÚ
addr_scoreÚ	expr_subsri   Úsingle_var_exprrt  Úbest_tilingÚbest_tiling_scorers  Útiling_counterÚtileÚ
tile_scorer‹  s)   &                                       @r)   Ú_analyze_memory_coalescingr«  Ù  s«  ø€ ô& 6°jÓAÐàÒÙà×"Ñ"€EØ×$Ñ$€FØ!×,Ñ,€Jä07³	ÐÜ/6«yÐð "×,Ñ,€JØ"×.Ñ.€Kç&0¿ŒŒX�jÓ!Ô"È$ð ô .7¯_ª_Ù0 %§+¡+¤-Ó0á2 6§<¡<¤>Ó2÷.Ñ)ˆÑ)�+ô
 ˜°)Ó<ˆØ�1Œ9Ùô ,¨KÓ8ˆçØ"&Ñä"4°[Ó"MÐð #Ò*Ü&8¸Ó&QÐ#àˆÛ!ˆHÜ—w‘w×-Ñ-¨hÓ7Ð7�×7Ð7Ü,¨XÓ6Ð6�×6Ð6ð œs 8¨TÓ2°S·Y±Y×5GÑ5GÕGÕG’ñ "ð 	ŸG‘q¨Õ*ˆçð $)Ð ØÒ(Ð-@Ô-Qô —}‘} Z°Ó3�ðÜ& {°DÓ9�EØ*+�D˜Ñ'Ü& {°DÓ9�EØ %¨¥�IØ  FÔ*Ø./˜˜]Ñ+Ü *¨;¸Ó =˜Ø$)¨E¥M˜	Ø$¨Ô.Ø37Ð0÷ (Ø ×5¸ÕDÖ5à ×/°;Õ>Ö/à×*¨kÕ9Ö*ñ}.÷@ Ü"Ø-Ø/Ø-ô
ð 	
ô 7BÄ'Ó6J€Mà(9×(?Ñ(?×(AÑ$Ð˜*ÜÐ/×0Ò0Ùä—M‘M *§/¡/Ó"3°QÓ7ˆ	Ø!×.Ñ.°·±Ó1B×BÑBˆAà˜
Ô"Ùà˜QŒÙà˜!�Ü(Ð)9¸9ÓEˆOØˆI�a‰Lä�?×/Ñ/Ó0°AÔ5Ùä,¨_Ó=ˆMð Ò%Ø$×0Ñ0×2Ò2Ø$×/×/Ð/áä Ó.ˆMÜ—7‘7×#Ñ#×7Ñ7¸ÀzÐRSÅ}×UÒUÙð
  !Ðß“3ô à+¨Z¸­]¸mÕ-KÑLó—3—3’3ô à+¨Z¸­]¸mÕ-KÑLó÷ ò ò à˜!Õ˜]×+¨zÕ9Ö+ôM Cñ )BôZ ˆ=Ó˜QÔÜ"Ø-Ø/Ø-ô
ð 	
ð 26€KØÐà,×2Ñ2Ö4Ñˆˆ^Ø .× 4Ñ 4Ö 6ÑˆD�*ØÐ-Ö-Ø" D˜k�Ø$.Ò!ó !7ñ  5ð ÒÜ"Ø-Ø/Ø-ô
ð 	
ô Ø)Ø+Ø)Ü! +¨a¥.°+¸aµ.ÐBSÓTô	ð øôy *¬9Ð5ô Úðús   ÇAS-Ó-TÔTc                óL   € V ^8„  d   QhR\         R,          R\        R,          /# )r"   rš   r   r$   N)r   rx  )r(   s   "r)   r*   r*   ™  s'   € ÷ ñ ÜÐ'Õ(ðä˜4Õñr+   c                 ó®  a€ V '       g   R # ^ RI Hp VP                  VP                  3o\        ;QJ d    V3R lV  4       F  '       d   K   RM	  RM! V3R lV  4       4      '       g   R # \        V 4      ^8X  d   V ^ ,          P                  4       # \        \        P                  RR 4      pVeÇ   VP                  P                  V ^ ,          P                  4       4      pVe“   \        VP                  4       4      p\        V4      \        V 4      8X  da   \        ;QJ d'    R \        W@RR7       4       F  '       d   K   RM	  RM! R \        W@RR7       4       4      '       d   VP                  4       # \!        \#        T \$        P&                  ! V  Uu. uF  qUP(                  NK  	  up4      \+        V R R	7      P,                  R
7      4      # u upi )N)rÞ   c              3   ó<   <"  € T F  p\        VS4      x € K  	  R # 5ir>   )r.   )rx   r¦   Ú
node_typess   & €r)   rz   Ú6analyze_memory_coalescing_for_nodes.<locals>.<genexpr>¢  s   øé € Ð>¹°Œz˜$ 
×+Ð+»ùs   ƒFTrÞ   c              3   ó,   "  € T F
  w  rWJ x € K  	  R # 5ir>   rG   )rx   Úfusedr¦   s   &  r)   rz   r°  ­  s   é € ð 6Ù1U¡+ %�•Ó1Uùs   ‚r#  c                 ó4   € \        V P                  4       4      # r>   )ra   rÄ   )r¦   s   &r)   rB  Ú5analyze_memory_coalescing_for_nodes.<locals>.<lambda>¶  s   € ¬c°$×2CÑ2CÓ2EÔ.Fr+   )Úkey)rš   r³   r´   )Útorch._inductorrÞ   r   r   r’  r/   Úget_coalesce_analysisÚgetattrr   rÅ   Úname_to_fused_noderb  Úget_first_namer  r�   r&  r«  r–   r   Ú
merge_listr³   rù   r´   )rš   rÞ   Úgraph_schedulerr€  Úfused_nodesr¦   r¯  s   &     @r)   Ú#analyze_memory_coalescing_for_nodesr¾  ™  sj  ø€ ÷ Ùå)à×.Ñ.°	×0GÑ0GÐH€Jß‹3Ô>¹Ó>�3�3Š3Ô>¹Ó>×>Ò>Ùä
ˆ5ƒz�Q„Ø�Q�x×-Ñ-Ó/Ð/äœaŸg™g {°DÓ9€OØÒ"Ø$×7Ñ7×;Ñ;¸EÀ!½H×<SÑ<SÓ<UÓVˆ
ØÒ!Ü˜z×3Ñ3Ó5Ó6ˆKÜ�;Ó¤3 u£:Ô-·#³#ñ 6Ü14°[ÐPTÕ1Uó6·#·#²#ñ 6Ü14°[ÐPTÕ1Uó6÷ 3ò 3ð "×7Ñ7Ó9Ð9ä%ÜØÜ"×-Ò-ÉEÓ.RÉEÀD×/?Ô/?ÉEÑ.RÓSÜ�eÑ!FÔG×MÑMô	
óð ùò /Ss   ÆG)F)GÚdataclassesr  Úcollectionsr   r   Úcollections.abcr   r   Útypingr   r   r	   r
   r   r   r&   rÜ   Útorch._inductor.dependenciesr   r   Útorch._inductor.utilsr   r   Útorch.utils._ordered_setr   Útorch.utils._sympy.functionsr   Útorch.utils._sympy.solver   Útorch.utils._sympy.symbolr   r   rc  r   r   r   r»   r'   rí   r  r†   r¼   Ú_loggingÚgetArtifactLoggerr‹   rf   r   r   Útorch._inductor.schedulerr   r   r   r8   rZ   rl   rp   r}   Ú	dataclassr€   r–   r¿   rÑ   r5  r^  rg  rm  rd   rq  rx  r«  r¾  rG   r+   r)   Ú<module>rÍ     s¼  ðÛ Û ß ,ß .ß H× Hã ã ß Jß ;Ý /Ý 1Ý .ß :å ñ ˆCƒL€ÙˆCƒL€ð 	ˆe�j‰j˜#ˆoÕ€Ø�d˜5Ÿ<™<Õ(¨$¨u¯z©zÕ*:Ð:Õ;€ð —.‘.×2Ñ2°8¸]ÓK€ß B÷ ÷ñ õõ0_õD õF#õLSð ×Ò˜dÔ#÷	(ð 	(ó $ð	(ð ×Ò˜dÔ#÷Bð Bó $ðBð 
ô5ó 
ð5ð 
ö.ó 
ð.÷/
÷d@ñ @õFJõZzõzHõ$Mõ5ð ×Ò˜dÔ#÷ð ó $ðð ×Ò˜dÔ#÷
-ð 
-ó $ð
-õ}÷@r+   