
    ȅin                        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Jr  S SKrS SKrS SKJ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#\$\RJ                  S4   r&\$\'\RP                     \'\RJ                     4   r)\RT                  RW                  \,S5      r-S SKJ.r.J/r/  \(       a  S SK0J1r1J2r2  S\RJ                  S\	\RJ                     4S jr3S\RJ                  S\	\RJ                     4S jr4S\RJ                  S\5\RJ                  \64   S\	\RJ                     4S jr7S\RJ                  S\5\RJ                  \64   S\	\RJ                     4S jr8S\RJ                  S\94S jr:\ Rv                  " SS9 " S  S!5      5       r<\
S"S#S$\RJ                  S%\RJ                  S&\S   S\	\$\)\)4      4
S' j5       r=\
 SCS"S#S$\RJ                  S%\RJ                  S&\S(   S\$\)\)4   4
S) jj5       r= SCS"S#S$\RJ                  S%\RJ                  S&\9S\	\$\)\)4      4
S* jjr= " S+ S,5      r>S-\'\RP                     S.\'\RP                     S/\'\RP                     S0\'\RP                     S1\'\'\RJ                        S2\'\'\\'\RJ                     /\RJ                  4         S\5\RP                  \RJ                  4   4S3 jr?S4\S   S\	\<   4S5 jr@S6\RJ                  S\5\RP                  \64   S7\\A   S\64S8 jrBS9\AS\	\6   4S: jrCS;\\RJ                  \64   S\64S< jrD\ Rv                  " SS9 " S= S>5      5       rE\ Rv                  " SS9 " S? S@5      5       rFSA\S   S\	\F   4SB jrGg)D    N)Counterdefaultdict)Callable)LiteralOptionaloverloadTYPE_CHECKINGTypeVarUnion)config)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/james-whalen/.local/lib/python3.13/site-packages/torch/_inductor/tiling_utils.pysolve_for_zeror0   %   s    
 	D(	#	#t  !Q&&&tD--./K$((1tyy|<kJq);7c!f((**q6M    c           	      l  ^ [        U R                  5      S:w  a  g[        [        U R                  5      5      mS[        R
                  S[        [        R
                     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[        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_exprK   st    88O,,TXXh5G5GGGt  !Q&q);7#a&,,..1vr1   FTxyzc                 
    X-  $ N )r7   r8   r9   s      r/   indexing_div_rep*solve_for_tiling.<locals>.indexing_div_repx   s    
 ur1   r   r;   )r&   r'   r(   r)   r*   Exprr   r4   r   r   Add	make_argsr%   Mulr,   r0   r$   appendsumreplacer   r   )r    r5   required_valueseq_1_expressionsargseenmul_argr.   	eq_1_exprr=   eq_1_expr_simplifiedr-   s              @r/   solve_for_tilingrM   :   s    4"tD--./K 0D  88O$$TXXh-?-?!$''O
 yy""4(c599%%D88$W-;((((&&s+ $   ##C(# )& $%I
 #':::: EJJ 
	 %,,_>NOWW" 1
2C *Yc(:;q@3
:o&'1,q!!r1   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)rN   rO   	variablesv
zero_indexnew_vals         r/   find_broadcast_varrZ      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   rQ   r#   N)	r*   r@   rA   r'   rR   r   rS   rT   rU   )rN   rO   top_level_termsrW   rV   rX   rY   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r;   )r   r   INDIRECT.0ss     r/   	<genexpr>&has_indirect_access.<locals>.<genexpr>   s      R9QA~a//9Qs   '))anyr'   )r^   s    r/   has_indirect_accessrh      s     R9Q9QRRRr1   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writesrO   r<   N)__name__
__module____qualname____firstlineno____doc__r   r*   Symbol__annotations__dictr?   strint__static_attributes__r<   r1   r/   rk   rk      sk     5<<((ELL))

JsO+,,Z_,--U\\3&''r1   rk   nr   pointwise_numel	red_numelnone_if_not_divisiblec                     g r;   r<   r|   r}   r~   r   s       r/   get_pw_red_splitsr      s     58r1   Fc                     g r;   r<   r   s       r/   r   r      s     +.r1   c                     U R                  5       (       d&  [        U R                  R                  S   5      U:X  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   _bodysizes	iter_varsrn   rR   r&   )
r|   r}   r~   r   iprod	pw_splitsr   
red_splitsred_varss
             r/   r   r     s    	~~=q)9:oM 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
 	
r1   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      4S
 jrSrg)NodeSplitGetteri-  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_groupr|   maybe_splits_n_pw_splitsn_red_splitsn_sizes	            r/   __init__NodeSplitGetter.__init__2  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<r1   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_optionsq  sz     '3s5zA~.A %a
mEa!e4D&E%GG%TUPUPW.X!I "#i.155i@	 / 4r1   )r&   r   r(   r)   r   r}   r~   maxkeysr   rx   rz   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_splitsc  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 %%'$..):;;r1   pwredc                    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   N)rq   rr   rs   rt   ru   r   r   r   r   r   r   r   r{   r<   r1   r/   r   r   -  sY    />9:/>b(<ue|!4 (<TE  (5;N2O r1   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r;   )r&   rb   s     r/   re   $apply_var_mapping.<locals>.<genexpr>  s     .:a3q66:s   zv_0:r   T)strictr   r   )rD   r*   symbolsr&   rC   r   zipupdater   itemsr   )r   r   r   r   r   r   num_vars	flat_varscountapply_groupsr   giter_vars_to_flat_varsr   	var_grouprW   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r;   )name)rc   depremoved_bufferss     r/   re   1extract_normalized_read_writes.<locals>.<genexpr>  s$      2Shho6U2s   --r   r   r|   )prefixNr    r!   c                 0    U R                  [        S 5      $ )Nc                     U $ r;   r<   )r7   s    r/   <lambda>Iextract_normalized_read_writes.<locals>.remove_identity.<locals>.<lambda>L  s    Ar1   )rE   r   )r    s    r/   remove_identity7extract_normalized_read_writes.<locals>.remove_identityK  s    <<+66r1   zNormalized Fused reads: %s)*r   r   get_buffer_namesget_operation_namesr   graphr   $can_buffer_be_removed_through_fusionr   read_writesro   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   sizevarssimplify_with_rangesrk   rT   rU   )*r   ro   rp   all_output_namesop_namesoutputsbuf_nameinputsr}   r~   r   r   r   r   rangesr|   bodyn_readsn_writesinpr    r.   r   r   r   r   r   r   r   r   var_mapr   readrW   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      [        R                  S9$ )z/
Score addr according to its approximate size.
r   r   fallback)r'   getr   r   ra   rC   virtualizedr   r   r  atomically_apply_size_hintr   r   unbacked_symint_fallback)r  rO   r  	var_sizesrW   v_sizer   s          r/   	get_scorer%  n  s     I"a//F4FV$	 
 7766i 6+J+J 7  r1   r
  c                     [         R                  R                  U 5      nU(       d  g [         R                  R                  R	                  [        UR                  5       5      [        R                  S9$ Nr  )	r   r   try_get_bufferr  r!  r   get_sizer   r"  )r
  bufs     r/   try_get_buf_sizer+    sT    
''
 
 
*C7766clln%0O0O 7  r1   rW   c                     [        U [        5      (       a  U $ [        R                  R                  R                  U [        R                  S9$ r'  )r%   rz   r   r   r  	size_hintr   r"  )rW   s    r/   rR   rR     s:    !Sww))!f6U6U)VVr1   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)
rq   rr   rs   rt   ru   r*   rv   rw   rz   r{   r<   r1   r/   r/  r/    s     
Jr1   r/  c                       \ rS rSr% \\R                  \4   \S'   \\R                  \4   \S'   \	\S'   Sr
\\   \S'   Srg)CoalesceVarAnalysisi  coalesced_by_varuncoalesced_addrsnorm_read_writesNsuggested_splitr<   )rq   rr   rs   rt   rx   r*   r?   rz   rw   rk   r8  r   r/  r{   r<   r1   r/   r4  r4    s?    
 5::s?++EJJO,,00+/OXi(/r1   r4  
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<   rc   items     r/   re   ,analyze_memory_coalescing.<locals>.<genexpr>  s     0-$$-   c              3   *   #    U  H	  nS U4v   M     g7f)FNr<   r<  s     r/   re   r>    s     2>4%>r?  r   r   r#   )r5  r6  r7     c              3   x   >#    U  H/  n[         R                  R                  R                  TU5      v   M1     g 7fr;   )r   r   r  statically_known_lt)rc   blockMIN_TILING_BLOCKs     r/   re   r>    s3      LE   445EuMMLs   7:)r5  r6  r7  r8  )#r  ro   rp   rO   r   r   r   r   r%  rh   r]   rZ   r   r   r(  r+  mindtypeitemsizer4  r   rx   fromkeysr   r'   r   r&   rM   r$   
is_integerrz   r  rC  allr/  )r9  r7  ro   rp   rO   r5  r6  is_readr^   r  sizeindirect_exprmaybe_coalesced_vartotal_scorer
  r*  buf_sizetiling_scoresuncoalesced_expr
addr_score	expr_subsrW   single_var_exprr1  best_tilingbest_tiling_scorer0  tiling_countertile
tile_scorerE  s                                 @r/   analyze_memory_coalescingr\    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*I.L "-/-
 	
 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"-/-
 	
 59K,224^ . 4 4 6D*--"Dk$.! !7  5 "-/-
 	
 )+)!+a.+a.BST	 r1   )F)Hdataclassesr   collectionsr   r   collections.abcr   typingr   r   r   r	   r
   r   r*   r   torch._inductorr   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  rv   VarsAndRanges_logginggetArtifactLoggerrq   rT   r   r   torch._inductor.schedulerr   r   r0   rM   rx   rz   rZ   r]   boolrh   	dataclassrk   r   r   r   r  ry   r%  r+  rR   r/  r4  r\  r<   r1   r/   <module>rn     si     , $ M M   " > ; / 1 . :  CLCL 	ejj#od5<<($uzz*::; ..228]K B K (< *W5:: W(5::*> Wt :: #'

C#8 ejj F#::##'

C#8#ejj#LSUZZ SD S d#	( 	( $	( 
88ZZ8 zz8 #4=	8
 eM=0128 
8 

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

 eM=012'
T 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
**"&u||S'8"9FPQTo(s x} Wejj#o& W3 W d#  $ d#
0 
0 $
0Y;<Y!"Yr1   