@@ -2235,6 +2235,136 @@ func.func @affine_leading_zero_no_outer_bound(%arg0: index, %arg1: index) -> ind
22352235
22362236// ----- 
22372237
2238+ // CHECK-LABEL: func @delin_apply_cancel_exact 
2239+ // CHECK-SAME: (%[[ARG0:.+]]: index, %[[ARG1:.+]]: memref<?xindex>) 
2240+ // CHECK-COUNT-6: memref.store %[[ARG0]], %[[ARG1]][%[[ARG0]]] 
2241+ // CHECK-NOT: memref.store 
2242+ // CHECK: return 
2243+ func.func  @delin_apply_cancel_exact (%arg0:  index , %arg1:  memref <?xindex >) {
2244+  %a:3  = affine.delinearize_index  %arg0  into  (4 , 5 ) : index , index , index 
2245+  %b:3  = affine.delinearize_index  %arg0  into  (3 , 4 , 5 ) : index , index , index 
2246+  %c:2  = affine.delinearize_index  %arg0  into  (20 ) : index , index 
2247+ 
2248+  %t1  = affine.apply  affine_map <()[s0 , s1 , s2 ] -> (s0  + s1  * 5  + s2  * 20 )>()[%a#2 , %a#1 , %a#0 ]
2249+  memref.store  %t1 , %arg1 [%t1 ] : memref <?xindex >
2250+ 
2251+  %t2  = affine.apply  affine_map <()[s0 , s1 , s2 ] -> (s0  + s2  * 20  + s1  * 5 )>()[%a#2 , %a#1 , %a#0 ]
2252+  memref.store  %t2 , %arg1 [%t2 ] : memref <?xindex >
2253+ 
2254+  %t3  = affine.apply  affine_map <()[s0 , s1 , s2 ] -> (s1  * 20  + s2  * 5  + s0 )>()[%a#2 , %a#0 , %a#1 ]
2255+  memref.store  %t3 , %arg1 [%t3 ] : memref <?xindex >
2256+ 
2257+  %t4  = affine.apply  affine_map <()[s0 , s1 , s2 ] -> (s0  + s1  * 5  + s2  * 20 )>()[%b#2 , %b#1 , %b#0 ]
2258+  memref.store  %t4 , %arg1 [%t4 ] : memref <?xindex >
2259+ 
2260+  %t5  = affine.apply  affine_map <()[s0 , s1 ] -> (s0  + s1  * 20 )>()[%c#1 , %c#0 ]
2261+  memref.store  %t5 , %arg1 [%t5 ] : memref <?xindex >
2262+ 
2263+  %t6  = affine.apply  affine_map <()[s0 , s1 ] -> (s1  * 20  + s0 )>()[%c#1 , %c#0 ]
2264+  memref.store  %t6 , %arg1 [%t5 ] : memref <?xindex >
2265+ 
2266+  return 
2267+ }
2268+ 
2269+ // ----- 
2270+ 
2271+ // CHECK-LABEL: func @delin_apply_cancel_exact_dim 
2272+ // CHECK: affine.for %[[arg1:.+]] = 0 to 256 
2273+ // CHECK: memref.store %[[arg1]] 
2274+ // CHECK: return 
2275+ func.func  @delin_apply_cancel_exact_dim (%arg0:  memref <?xindex >) {
2276+  affine.for  %arg1  = 0  to  256  {
2277+  %a:3  = affine.delinearize_index  %arg1  into  (2 , 2 , 64 ) : index , index , index 
2278+  %i  = affine.apply  affine_map <(d0 , d1 , d2 ) -> (d0  + d1  * 128  + d2  * 64 )>(%a#2 , %a#0 , %a#1 )
2279+  memref.store  %i , %arg0 [%i ] : memref <?xindex >
2280+  }
2281+  return 
2282+ }
2283+ 
2284+ // ----- 
2285+ 
2286+ // CHECK-DAG: #[[$MAP:.+]] = affine_map<()[s0] -> (s0 + 512)> 
2287+ // CHECK-LABEL: func @delin_apply_cancel_const_term 
2288+ // CHECK-SAME: (%[[ARG0:.+]]: index, %[[ARG1:.+]]: memref<?xindex>) 
2289+ // CHECK: affine.apply #[[$MAP]]()[%[[ARG0]]] 
2290+ // CHECK: return 
2291+ func.func  @delin_apply_cancel_const_term (%arg0:  index , %arg1:  memref <?xindex >) {
2292+  %a:3  = affine.delinearize_index  %arg0  into  (2 , 2 , 64 ) : index , index , index 
2293+ 
2294+  %t1  = affine.apply  affine_map <()[s0 , s1 , s2 ] -> (s0  + s1  * 128  + s2  * 64  + 512 )>()[%a#2 , %a#0 , %a#1 ]
2295+  memref.store  %t1 , %arg1 [%t1 ] : memref <?xindex >
2296+ 
2297+  return 
2298+ }
2299+ 
2300+ // ----- 
2301+ 
2302+ // CHECK-DAG: #[[$MAP:.+]] = affine_map<()[s0, s1] -> (s0 + s1 + 512)> 
2303+ // CHECK-LABEL: func @delin_apply_cancel_var_term 
2304+ // CHECK-SAME: (%[[ARG0:.+]]: index, %[[ARG1:.+]]: memref<?xindex>, %[[ARG2:.+]]: index) 
2305+ // CHECK: affine.apply #[[$MAP]]()[%[[ARG2]], %[[ARG0]]] 
2306+ // CHECK: return 
2307+ func.func  @delin_apply_cancel_var_term (%arg0:  index , %arg1:  memref <?xindex >, %arg2:  index ) {
2308+  %a:3  = affine.delinearize_index  %arg0  into  (2 , 2 , 64 ) : index , index , index 
2309+ 
2310+  %t1  = affine.apply  affine_map <()[s0 , s1 , s2 , s3 ] -> (s0  + s1  * 128  + s2  * 64  + s3  + 512 )>()[%a#2 , %a#0 , %a#1 , %arg2 ]
2311+  memref.store  %t1 , %arg1 [%t1 ] : memref <?xindex >
2312+ 
2313+  return 
2314+ }
2315+ 
2316+ // ----- 
2317+ 
2318+ // CHECK-DAG: #[[$MAP:.+]] = affine_map<()[s0] -> (s0 * 2 + s0 ceildiv 4)> 
2319+ // CHECK-LABEL: func @delin_apply_cancel_nested_exprs 
2320+ // CHECK-SAME: (%[[ARG0:.+]]: index, %[[ARG1:.+]]: memref<?xindex>) 
2321+ // CHECK: affine.apply #[[$MAP]]()[%[[ARG0]]] 
2322+ // CHECK: return 
2323+ func.func  @delin_apply_cancel_nested_exprs (%arg0:  index , %arg1:  memref <?xindex >) {
2324+  %a:2  = affine.delinearize_index  %arg0  into  (20 ) : index , index 
2325+ 
2326+  %t1  = affine.apply  affine_map <()[s0 , s1 ] -> ((s0  + s1  * 20 ) ceildiv  4  + (s1  * 20  + s0 ) * 2 )>()[%a#1 , %a#0 ]
2327+  memref.store  %t1 , %arg1 [%t1 ] : memref <?xindex >
2328+ 
2329+  return 
2330+ }
2331+ 
2332+ // ----- 
2333+ 
2334+ // CHECK-DAG: #[[$MAP:.+]] = affine_map<()[s0, s1] -> (s0 + s1)> 
2335+ // CHECK-LABEL: func @delin_apply_cancel_preserve_rotation 
2336+ // CHECK-SAME: (%[[ARG0:.+]]: index, %[[ARG1:.+]]: memref<?xindex>) 
2337+ // CHECK: %[[A:.+]]:2 = affine.delinearize_index %[[ARG0]] into (20) 
2338+ // CHECK: affine.apply #[[$MAP]]()[%[[A]]#1, %[[ARG0]]] 
2339+ // CHECK: return 
2340+ func.func  @delin_apply_cancel_preserve_rotation (%arg0:  index , %arg1:  memref <?xindex >) {
2341+  %a:2  = affine.delinearize_index  %arg0  into  (20 ) : index , index 
2342+ 
2343+  %t1  = affine.apply  affine_map <()[s0 , s1 ] -> (s0  + s1  * 20  + s0 )>()[%a#1 , %a#0 ]
2344+  memref.store  %t1 , %arg1 [%t1 ] : memref <?xindex >
2345+ 
2346+  return 
2347+ }
2348+ 
2349+ // ----- 
2350+ 
2351+ // CHECK-DAG: #[[$MAP:.+]] = affine_map<()[s0, s1] -> (s0 + s1 * 5)> 
2352+ // CHECK-LABEL: func @delin_apply_dont_cancel_partial 
2353+ // CHECK-SAME: (%[[ARG0:.+]]: index, %[[ARG1:.+]]: memref<?xindex>) 
2354+ // CHECK: %[[A:.+]]:3 = affine.delinearize_index %[[ARG0]] into (3, 4, 5) 
2355+ // CHECK: affine.apply #[[$MAP]]()[%[[A]]#2, %[[A]]#1] 
2356+ // CHECK: return 
2357+ func.func  @delin_apply_dont_cancel_partial (%arg0:  index , %arg1:  memref <?xindex >) {
2358+  %a:3  = affine.delinearize_index  %arg0  into  (3 , 4 , 5 ) : index , index , index 
2359+ 
2360+  %t1  = affine.apply  affine_map <()[s0 , s1 ] -> (s0  + s1  * 5 )>()[%a#2 , %a#1 ]
2361+  memref.store  %t1 , %arg1 [%t1 ] : memref <?xindex >
2362+ 
2363+  return 
2364+ }
2365+ 
2366+ // ----- 
2367+ 
22382368// CHECK-LABEL: @cst_value_to_cst_attr_basis_delinearize_index 
22392369// CHECK-SAME: (%[[ARG0:.*]]: index) 
22402370// CHECK: %[[RET:.*]]:3 = affine.delinearize_index %[[ARG0]] into (3, 4, 2) : index, index 
0 commit comments