
    3jn                        S SK r S SKrS SKJrJr  S SKJr  S SKJrJ	r	J
r
JrJr  S SKrS SKrS SKJr  S SKJrJr  S SKJr  S SKJr  S S	KJr  S S
KJrJr  SSKJr  \" S5      r\" S5      r \!\RD                  S4   r#\!\$\RJ                     \$\RD                     4   r&\RN                  RQ                  \)S5      r*S SKJ+r+J,r,  \
(       a  S SK-J.r.J/r/  S\RD                  S\RD                  S-  4S jr0S\RD                  S\RD                  S-  4S jr1S\RD                  S\2\RD                  \34   S\RD                  S-  4S jr4S\RD                  S\2\RD                  \34   S\RD                  S-  4S jr5S\RD                  S\64S jr7\ Rp                  " SS9 " S S 5      5       r9\	S!S"S#\RD                  S$\RD                  S%\S   S\!\&\&4   S-  4
S& j5       r:\	 SBS!S"S#\RD                  S$\RD                  S%\S'   S\!\&\&4   4
S( jj5       r: SBS!S"S#\RD                  S$\RD                  S%\6S\!\&\&4   S-  4
S) jjr: " S* S+5      r;S,\$\RJ                     S-\$\RJ                     S.\$\RJ                     S/\$\RJ                     S0\$\$\RD                        S1\$\$\\$\RD                     /\RD                  4         S\2\RJ                  \RD                  4   4S2 jr<S3\S   S\9S-  4S4 jr=S5\RD                  S\2\RJ                  \34   S6\\>   S\34S7 jr?S8\>S\3S-  4S9 jr@S:\RD                  \3-  S\34S; jrA\ Rp                  " SS9 " S< S=5      5       rB\ Rp                  " SS9 " S> S?5      5       rCS@\S   S\CS-  4SA jrDg)C    N)Counterdefaultdict)Callable)LiteraloverloadTYPE_CHECKINGTypeVarUnion)index_vars_no_squeeze)sympy_product
sympy_subs)
OrderedSet)Identity)	try_solve)symbol_is_typeSymT   VTU.loop_tiling)FloorDivModularIndexingFusedSchedulerNodeSchedulerNodeexprreturnc                    U R                  5       (       a  g[        U [        5      (       a  g[        U R                  5      S:X  d   e[        [        U R                  5      5      n[        U [        5      (       a<  [        [        R                  " U R                  S   U R                  S   5      U5      nO![        [        R                  " U S5      U5      nU(       a  US   R                  5       (       d  gUS   $ )zk
Given an expr with a single free symbol, solve for a constant relation that would make
this expression 0.
Nr   r      )is_constant
isinstancer   lenfree_symbolsnextiterr   r   sympyEqargs)r   free_symbolouts      V/home/wildlama/miniconda3/lib/python3.13/site-packages/torch/_inductor/tiling_utils.pysolve_for_zeror.   $   s    
 	D(	#	#t  !Q&&&tD--./K$((1tyy|<kJq);7c!f((**q6M    c           	      \  ^ [        U R                  5      S:w  a  g[        [        U R                  5      5      mS[        R
                  S[        R
                  S-  4U4S jjnU R                  [        5      (       d"  U R                  [        5      (       d  U" U 5      $ / n/ n[        R                  R                  U 5       H  n[        U[        R                  5      (       aZ  SnUR                   H=  n[        U5      nUc  M  UR                  5       (       d   eSnUR!                  U5        M?     U(       d    gM|  UR!                  U5        M     U(       d  g[#        U5      n SS[        R
                  S	[        R
                  S
[        R
                  S-  S[        R
                  4S jjn	UR%                  [        U	5      R%                  [        U	5      n
U" U
5      nU(       a  ['        UTU05      S:w  a  gUR!                  U5        [        [)        U5      5      S:X  a  US   $ g)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).
r   Nr   r   c                 0  > U R                  [        5      (       d  U R                  [        5      (       a   e[        U R                  5      S:w  a  g [        [        R                  " U S5      T5      nU(       a  US   R                  5       (       d  g US   $ )Nr   )	hasr   r   r$   r%   r   r(   r)   r"   )r   r,   r+   s     r-   _solve_simple_expr,solve_for_tiling.<locals>._solve_simple_exprJ   st    88O,,TXXh5G5GGGt  !Q&q);7#a&,,..1vr/   FTxyzc                 
    X-  $ N )r5   r6   r7   s      r-   indexing_div_rep*solve_for_tiling.<locals>.indexing_div_repw   s    
 ur/   r   r9   )r$   r%   r&   r'   r(   Exprr2   r   r   Add	make_argsr#   Mulr*   r.   r"   appendsumreplacer   r   )r   r3   required_valueseq_1_expressionsargseenmul_argr,   	eq_1_exprr;   eq_1_expr_simplifiedr+   s              @r-   solve_for_tilingrK   9   s    4"tD--./K 

T0A  88O$$TXXh-?-?!$''O
 yy""4(c599%%D88$W-;((((&&s+ $   ##C(# )& $%I
  $:::: :: 
	 %,,_>NOWW" 1
2C *Yc(:;q@3
:o&'1,q!!r/   index
var_rangesc                 0   0 nU R                    H  nX1;   a  SX#'   M  [        U5      X#'   M     [        X5      nU H1  nX0R                   ;  a  M  SX#'    [        X5      nXT:X  a  Us  $ SX#'   M3     g! [         a    [        R                  SX5         MY  f = f)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).
r   r   zero division error %s %sN)r%   get_hintr   ZeroDivisionErrorloop_tiling_loginfo)rL   rM   	variablesv
zero_indexnew_vals         r-   find_broadcast_varrX      s     *,I?IL#A;IL	   E-J&&&		 2G
  H	   ! 	  !<eO	s   A11 BBc                    [         R                  R                  U 5      nU H  nX2;   d  M
  Us  $    0 nU R                   H  nX1;   a  SXC'   M  [	        U5      XC'   M     [        X5      nU H9  nSXC'    [        X5      nXe-
  S:X  a  SXC'   [        X5      U-
  S:X  a  Us  $ SXC'   M;     g! [         a    [        R                  SX5         Ma  f = f)z3
Try to find the symbol which coalesces this index
r   r   rO   r!   N)	r(   r>   r?   r%   rP   r   rQ   rR   rS   )rL   rM   top_level_termsrU   rT   rV   rW   s          r-   find_coalesced_varr[      s     ii))%0OH 
 *,I?IL#A;IL	   E-J		 2G 1$IL 5,w61<	   ! 	  !<eO	s   4B** CCmemory_exprc                 :    [        S U R                   5       5      $ )z<
Check if this memory expression has any indirect indexing.
c              3   V   #    U  H  n[        U[        R                  5      v   M!     g 7fr9   )r   r   INDIRECT.0ss     r-   	<genexpr>&has_indirect_access.<locals>.<genexpr>   s      R9QA~a//9Qs   '))anyr%   )r\   s    r-   has_indirect_accessrf      s     R9Q9QRRRr/   T)frozenc                       \ rS rSr% Sr\\R                     \S'   \\R                     \S'   \	\R                  \\   4   \S'   \	\R                  \\   4   \S'   \	\R                  \4   \S'   Srg	)
FusedNormalizedReadsWrites   zG
Normalized reads and writes for nodes in the same FusedSchedulerNode.

index_varsreduce_varsreadswritesrM   r:   N)__name__
__module____qualname____firstlineno____doc__r   r(   Symbol__annotations__dictr=   strint__static_attributes__r:   r/   r-   ri   ri      sk     5<<((ELL))

JsO+,,Z_,--U\\3&''r/   ri   nr   pointwise_numel	red_numelnone_if_not_divisiblec                     g r9   r:   rz   r{   r|   r}   s       r-   get_pw_red_splitsr      s     25r/   Fc                     g r9   r:   r   s       r-   r   r      s     +.r/   c                 r   U R                  5       (       dO  [        R                  R                  R	                  [        U R                  R                  S   5      U5      (       a^  U R                  R                  U R                  R                  S   4U R                  R                  U R                  R                  S   44$ [        [        U R                  R                  S   5      5      [        X-  5      :X  d   e[        U R                  R                  S   5      S-
  nSnUS:  a1  XPR                  R                  S   U   -  nXR:X  a  OUS-  nUS:  a  M1  US:  ap  U R                  R                  S   SU nU R                  R                  SU nU R                  R                  S   US  nU R                  R                  US  n	Xv4X44$ U(       a  g U R                  R                  U R                  R                  S   4U R                  R                  U R                  R                  S   44$ )Nr   r   )is_reductionr   graphsizevarsstatically_known_equalsr   _bodysizes	iter_varsrl   rP   r$   )
rz   r{   r|   r}   iprod	pw_splitsr   
red_splitsred_varss
             r-   r   r     s    	~~177++CCaggmmA&' 
 WWa 01WW  !''--"23
 	

 M!''--"234#9    	AGGMM!!AD
q&a ##	Q	 q& 	AvGGMM!$Qq)	GG%%a*	WW]]1%ab)
77$$QR(%'=== WWa 01WW  !''--"23
 	
r/   c                   j    \ rS rSrSrS\S   4S jrS\\\4   4S jr	S\S	\S\\\4   S
-  4S jr
Srg
)NodeSplitGetteri1  zW
Finds a Pointwise, Reduction Split that compatible with all nodes in a SchedulerNode.
noder   c                 r   Xl         UR                  S   S   U l        UR                  S   S   U l        [	        [
        5      U l        [	        [
        5      U l        SU l        [        5       U l	        UR                  S   n[        UR                  5       5       GH  n[        U[        R                  R                  R                   5      (       d  M9  [#        X0R                  U R                  SS9nUc1  U R                  R%                  UR&                  R(                  5        M  Uu  u  pVu  pW[        R                  R*                  R,                  R.                  R1                  X&U4U R                  5      u  pgU R                  [3        U5         R%                  [5        U5      5        U R                  [3        U5         R%                  [5        U5      5        US:w  a  [7        U5      4U l        [5        U5      [5        U5      4nU R                  R%                  U5        GM     [        5       U l        g )Nr   r   r:   T)r}   )r   groupr{   r|   r   r   pw_split_optionsred_split_optionsreduction_splitall_node_sizesreversed	get_nodesr#   torch	_inductor	schedulerr   r   addr   r   codegensimd
SIMDKernelprepare_split_iteration_lengthsr$   tupler   seen_pw_splits)	selfr   fused_grouprz   maybe_splits_n_pw_splitsn_red_splitsn_sizes	            r-   __init__NodeSplitGetter.__init__6  s    	+/::a=+;%)ZZ]1%5>I*>U?J:?V&(?I|jjm$..*+Aa!:!:!H!HII
 -''tL ###''62>/Q/q '',,77WW|!<dnn &K !!#k"2377k8JK""3|#4599%:MNr!(5l(C'E$K(%*=>F##F+= ,@ 2<r/   r   c                 F   [        U R                  5      S:X  a  [        [        U R                  5      5      $ [        U R                  5      S:X  a  U R
                  4U R                  44$ [        U R                  R                  5       5      n[        U R                  R                  5       5      nS[        [        [        [           4   S[        SS4S jnX-   n[        [        USS5      5       H  u  pV[        USS5       HS  nU R                  U    H=  nU R                  Xg-
      H%  n	U R!                  X5      =n
(       d  M  U
s  s  s  s  $    M?     MU     U" U R                  X-
  5        U" U R                  X%-
  5        M     U R
                  4U R                  44$ )	z9
Get a compatible pointwise, reduction split of the node
r   r   split_optionscurr_lengthr   Nc                     X    Hf  n[        [        U5      S-
  5       HH  n[        USU [        X#US-    5      4-   X#S-   S  -   5      nU [        U5         R	                  U5        MJ     Mh     g )Nr   r   r!   )ranger$   r   r   r   )r   r   splitr   	new_splits        r-   add_combined_split_optionsCNodeSplitGetter.get_node_splits.<locals>.add_combined_split_optionsu  sz     '3s5zA~.A %a
mEa!e4D&E%GG%TUPUPW.X!I "#i.155i@	 / 4r/   )r$   r   r&   r'   r   r{   r|   maxkeysr   rv   rx   r   Split	enumerater   	try_split)r   max_pw_splitmax_red_splitr   max_total_splits	curr_itertotal_splitspw_split_lenpw_split	red_splitr,   s              r-   get_node_splitsNodeSplitGetter.get_node_splitsg  s   
 t""#q(T00122t$$%*))+dnn->??4005578D22779:	AZ%6 67	AFI	A	A (7'07GB1O'P#I %lAr : $ 5 5l CH%)%;%;$3&	 #'.."EE3E#&JJ	& !D !; 't'<'<l>VW&&&(A (Q %%'$..):;;r/   pwredNc                    SSK JnJn  XR                  ;   a  gU R                  R	                  U5        U R
                   H  u  pV X-   nXV4nUR                  Xx5      u  p[        U
5      S:X  d   eU	S[        U5       n[        [        R                  R                  U5      5      nX:w  d  Mn  U R                  X5      =n(       d  M  Us  $    X4$ ! U a       gf = f)z[
See if this split is compatible, and potentially returning a longer split
than the input.
r   )	CantSplitr   Nr!   )torch._inductor.codegen.simdr   r   r   r   r   _split_iteration_rangesr$   r   	itertoolschainfrom_iterabler   )r   r   r   r   r   n_pwn_redgroupslengthssplitsgetterspw_group_splitsflattened_pw_splitsr,   s                 r-   r   NodeSplitGetter.try_split  s     	G$$$#..KD-","D"DV"U w<1$$$$Ys2w/O
 #(	(E(Eo(V"W"(..)<BB3BJ# /& w  s   CCC)r   r   r{   r   r|   r   r   r   )ro   rp   rq   rr   rs   r
   r   r   r   r   r   ry   r:   r/   r-   r   r   1  sY    />9:/>b(<ue|!4 (<TE  %u2E2L r/   r   r   r   norm_pw_varsnorm_red_vars
new_rangesreturn_getters_groupsc           	         [        S U 5       5      n[        R                  " SU 35      nSn[        U 5      S:X  a  [        U5      S:X  a  0 $ [        U5      [        X#-   5      :X  d   e/ n	U H*  n
U	R	                  U
 Vs/ s H
  o" U5      PM     sn5        M,     0 n[        [        XU4SS95       Hj  u  nu  p[        U
5      [        U5      :w  a  US:X  d   e[        U5      S:X  d   eM;  UR                  [        X5       VVs0 s H  u  pX_M	     snn5        Ml     Sn0 n[        XBU-   SS9 Hp  u  nn/ n[        [        U5      5       H  nUR	                  Xx   5        US-  nM     Sn[        [        U5      S-
  SS5       H  nUU-  UUU   '   UU   U-  nM     Mr     UR                  5        VVs0 s H  u  nnU[        UU5      _M     snn$ s  snf s  snnf s  snnf )zBMaps original variables to expressions using normalized variables.c              3   8   #    U  H  n[        U5      v   M     g 7fr9   )r$   r`   s     r-   rc   $apply_var_mapping.<locals>.<genexpr>  s     .:a3q66:s   zv_0:r   T)strictr   r   )rB   r(   symbolsr$   rA   r   zipupdater   itemsr   )r   r   r   r   r   r   num_vars	flat_varscountapply_groupsr   giter_vars_to_flat_varsr   	var_grouprU   flat_vars_to_new_vars	new_rangenew_var
range_varsr   r   ks                          r-   apply_var_mappingr     s   . .:..HXJ/0IE
9~s8}1	z?c,">????L&595aQy\59: '  !*Lh/="E
 u:Y'6M6y>Q&&&%%E8M&N8Mqt8M&NO" E!=0	7 
s9~&Ai./QJE ' s9~)2r2A3:T>!*Q-0Q<$&D 3 +0022DAq 	
:a.//2 = : 'O"s    G
G9G"r   c           
      	  ^) [        [        5      n[        [        5      nU R                  5       nU R                  5       n[        5       n[        5       m)U HU  n[        R
                  R                  R                  Xd5      (       a  T)R                  U5        MD  UR                  U5        MW     [        U)4S jU R                  R                   5       5      nU R                  S   S   nU R                  S   S   n	[        U 5      R                  5       u  p[        XSS9u  u  pn[        U R!                  5       5       GHj  n[#        U[$        R&                  R                  R(                  5      (       d  M9  UR*                  n[        [        5      n[        [        5      nU H/  nUR-                  U5       H  nUU   R                  U5        M     M1     U H/  nUR/                  U5       H  nUU   R                  U5        M     M1     U(       d	  U(       d  M  [1        XU	5      u  u  nnu  nnX-   nUU4n[$        R&                  R2                  R4                  R6                  R9                  UUU	5      n [$        R&                  R2                  R4                  R6                  R;                  UU5      u  nn[A        UUUUUU5      nS[B        RD                  S[B        RD                  4S	 jnURG                  5        V V!s0 s H  u  n n![I        U" U 5      U5      U!_M     n"n n!URG                  5        V#V!s0 s H  u  n#n![I        U" U#5      U5      U!_M     n$n#n!U"RG                  5        H  u  nn%UU==   U%-  ss'   M     U$RG                  5        H  u  nn%UU==   U%-  ss'   M     GMm     URG                  5        V&V!s0 s H1  u  n&n![        R
                  RJ                  RM                  U&U5      U!_M3     nn&n!URG                  5        V'V!s0 s H1  u  n'n![        R
                  RJ                  RM                  U'U5      U!_M3     nn'n![O        UUUUU5      n([P        RS                  S
U(5        U($ ! [$        R&                  R2                  R4                  R<                   a(    UR>                  (       d  U	R>                  (       d   e   gf = fs  sn!n f s  sn!n#f s  sn!n&f s  sn!n'f )zjExtracts index variables, reduce variables, read/write expressions, and variable ranges from a fused node.c              3   ^   >#    U  H"  oR                   T;  d  M  UR                   v   M$     g 7fr9   )name)ra   depremoved_bufferss     r-   rc   1extract_normalized_read_writes.<locals>.<genexpr>	  s$      2Shho6U2s   --r   r   rz   )prefixNr   r   c                 0    U R                  [        S 5      $ )Nc                     U $ r9   r:   )r5   s    r-   <lambda>Iextract_normalized_read_writes.<locals>.remove_identity.<locals>.<lambda>P  s    Ar/   )rC   r   )r   s    r-   remove_identity7extract_normalized_read_writes.<locals>.remove_identityO  s    <<+66r/   zNormalized Fused reads: %s)*r   r   get_buffer_namesget_operation_namesr   r   r   $can_buffer_be_removed_through_fusionr   read_writesrm   r   r   r   r   listr   r#   r   r   r   r   get_all_read_exprget_all_write_exprr   r   r   r   r   r   r   r%   r   r(   r=   r   r   r   simplify_with_rangesri   rR   rS   )*r   rm   rn   all_output_namesop_namesoutputsbuf_nameinputsr{   r|   r   r   r   r   rangesrz   bodyn_readsn_writesinpr   r,   r   r   r   r   r   r   r   r   var_mapr   readrU   n_reads_newwriten_writes_new	buf_namesrw	fused_outr   s*                                            @r-   extract_normalized_read_writesr    sv    0;:/FE0;J0GF,,.'')H)|G'1|O$77AA(UU)KK!	 %   ,,22 F #'**Q-"2O JJqM!,I+D1AACI -Bc-)!\6 $.."#!U__66DDEEww5@5L6A*6M C..s3!!#& 4  C//4""3' 5  x=N	>
: K":8\ '/OO##((33SS 	

	'',,77OOG .J- $!
	7%** 	7 	7 JQ
IXgdAJt,g69 	 

 %NN,
,q u-w7:, 	 

  +002OD)$K9$K  3  ,113OD)4LI%L  4M $T INHU1--a8!; 
  IOHV1--a8!;   +I 5yAc &&++55 	 #//93I3III		(

s,   9AQ1 S8 S8S8S 1AS
Saddrr  c                 $   / nU R                    HK  nUR                  U5      n[        U[        R                  5      (       a  M5  Uc  M:  UR                  U5        MM     SSKJn  UR                  R                  R                  [        U5      5      $ )z/
Score addr according to its approximate size.
r   r   )r%   getr   r   r_   rA   virtualizedr   r   r   optimization_hintr   )r  rM   r  	var_sizesrU   v_sizer   s          r-   	get_scorer!  r  sp     I"a//F4FV$	 
 77--mI.FGGr/   r	  c                     [         R                  R                  U 5      nU(       d  g [         R                  R                  R	                  [        UR                  5       5      5      $ r9   )r   r   try_get_bufferr   r  r   get_size)r	  bufs     r-   try_get_buf_sizer&    sB    
''
 
 
*C77--mCLLN.KLLr/   rU   c                     [        U [        5      (       a  U $ [        R                  R                  R                  U 5      $ r9   )r#   rx   r   r   r   r  )rU   s    r-   rP   rP     s/    !Sww11!44r/   c                   L    \ rS rSr% Sr\R                  \S'   \\S'   \\S'   Sr	g)	VarTilingi  ze
Tiling of a var by `tiling_factor` that yields additional coalesced mem accesses by `benefit_score`
vartiling_factorscorer:   N)
ro   rp   rq   rr   rs   r(   rt   ru   rx   ry   r:   r/   r-   r)  r)    s     
Jr/   r)  c                       \ rS rSr% \\R                  \4   \S'   \\R                  \4   \S'   \	\S'   Sr
\S-  \S'   Srg)CoalesceVarAnalysisi  coalesced_by_varuncoalesced_addrsnorm_read_writesNsuggested_splitr:   )ro   rp   rq   rr   rv   r(   r=   rx   ru   ri   r2  r)  ry   r:   r/   r-   r.  r.    s?    
 5::s?++EJJO,,00(,OY%,r/   r.  
fused_nodec           
        ^ [        U 5      nUc  gUR                  nUR                  nUR                  n[	        5       n[	        5       n[
        R                  " S UR                  5        5       S UR                  5        5       5       H  u  nu  p[        XU	5      n
U
S:X  a  M  [        U5      nU(       a  SnO[        X5      nUc  [        X5      nSnU	 He  n[        R                  R                  U5      =n(       d  M+  [        U5      =n(       d  M?  U[!        UU
5      UR"                  R$                  -  -  nMg     X(       a  SOS-  nU(       a  X\==   U-  ss'   M  Xh==   U-  ss'   M     U(       d  ['        UUUS9$ [)        [        5      nUR                  5        GHK  u  nn[        U5      (       a  M  [*        R-                  UR/                  5       S5      nUR0                  UR/                  5       -   H  nUU;  a  M  US:X  a  M  UU	 [3        UU5      nSUU'   [5        UR0                  5      S:w  a  MB  [7        U5      nUb&  UR9                  5       (       a  UR:                  (       d  Mx  [=        U5      n[        R                  R>                  RA                  UUU   5      (       d  M  Sm[C        U4S	 jUUU   U-  4 5       5      (       d  M  UU   U==   U-  ss'   M     GMN     [5        U5      S:X  a  ['        UUUS9$ SnSnUR                  5        H.  u  nnUR                  5        H  u  nnUU:  d  M  UU4nUnM     M0     Uc  ['        UUUS9$ ['        UUU[E        US   US   U5      S
9$ )a?  
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   *   #    U  H	  nS U4v   M     g7f)TNr:   ra   items     r-   rc   ,analyze_memory_coalescing.<locals>.<genexpr>  s     0-$$-   c              3   *   #    U  H	  nS U4v   M     g7f)FNr:   r6  s     r-   rc   r8    s     2>4%>r9  r   r   r!   )r/  r0  r1     c              3   x   >#    U  H/  n[         R                  R                  R                  TU5      v   M1     g 7fr9   )r   r   r   statically_known_lt)ra   blockMIN_TILING_BLOCKs     r-   rc   r8    s3      LE   445EuMMLs   7:)r/  r0  r1  r2  )#r  rm   rn   rM   r   r   r   r   r!  rf   r[   rX   r   r   r#  r&  mindtypeitemsizer.  r   rv   fromkeysr   r%   r   r$   rK   r"   
is_integerrx   r   r=  allr)  )r3  r1  rm   rn   rM   r/  r0  is_readr\   r  sizeindirect_exprmaybe_coalesced_vartotal_scorer	  r%  buf_sizetiling_scoresuncoalesced_expr
addr_score	expr_subsrU   single_var_exprr+  best_tilingbest_tiling_scorer*  tiling_countertile
tile_scorer?  s                                 @r-   analyze_memory_coalescingrV    s     6jA""E$$F!,,J07	/6y-6__0%++-026<<>2.))+
 )<19 ,K8"&"4["M #*&8&Q#!Hww--h777,X666 s8T2SYY5G5GGG " 	Gq*1[@1*k9*K.N "-/-
 	
 7B'6JM(9(?(?(A$*/00MM*//"3Q7	!..1BBA
"Q!()99EOIaL?//0A5,_=M %$0022$//.M77##77zRS}UU
  ! +Z]m-KL   !]+z9+M C )BZ =Q"-/-
 	
 26K,224^ . 4 4 6D*--"Dk$.! !7  5 "-/-
 	
 )+)!+a.+a.BST	 r/   )F)Edataclassesr   collectionsr   r   collections.abcr   typingr   r   r   r	   r
   r(   r   torch._inductor.dependenciesr   torch._inductor.utilsr   r   torch.utils._ordered_setr   torch.utils._sympy.functionsr   torch.utils._sympy.solver   torch.utils._sympy.symbolr   r   r  r   r   r   r   r=   r   r  rt   VarsAndRanges_logginggetArtifactLoggerro   rR   r   r   torch._inductor.schedulerr   r   r.   rK   rv   rx   rX   r[   boolrf   	dataclassri   r   r   r   r  rw   r!  r&  rP   r)  r.  rV  r:   r/   r-   <module>rg     se     , $ C C   > ; / 1 . :  CLCL 	ejj#od5<<($uzz*::; ..228]K B K 

T(9 *W5:: W%**t*; Wt :: #'

C#8 
ZZ$ F#::##'

C#8#
ZZ$#LSUZZ SD S d#	( 	( $	( 
55ZZ5 zz5 #4=	5
 =-'(4/5 
5 

 -2	..ZZ. zz. #5>	.
 =-'(. 
. #(	,
,
ZZ,
 zz,
  	,

 =-'(4/,
^ DBELL!B5<< B u||$B %	B
 T%**%&B  XtEJJ/?.@%**.L%M NOB 
%,,


"#BJw
5
6w$&wtH
**H"&u||S'8"9HFPQToHH$Ms MsTz M5

S  5S 5 d#  $ d#
- 
- $
-Z;<Z4Zr/   