vinx13 commented on code in PR #14766:
URL: https://github.com/apache/tvm/pull/14766#discussion_r1192953543


##########
src/tir/schedule/primitive/blockize_tensorize.cc:
##########
@@ -219,30 +227,43 @@ Map<Var, PrimExpr> DeriveBlockBinding(const 
Array<IterVar>& iter_vars,
     // The inner block will have binding: iter_inner -> inner_binding
     // The iter in the original block will be substituted with base + 
iter_inner where
     // base == iter_outer * iter_inner_extent
-    if (is_one(inner_mark->extent)) {  // IsOuter
-      // extract this iter var to outer block directly
+    // create iter var for the outer block
+    IterVar outer_iter;
+    if (reuse_outer) {
+      outer_iter = outer_iter_vars->operator[](i);
+      ICHECK(ana.CanProveEqual(outer_iter->dom->extent, outer_mark->extent));
+      ICHECK(
+          ana.CanProveEqual(outer_bindings->operator[](i), 
NormalizeIterMapToExpr(outer_binding)));
+    } else {
+      outer_iter = IterVar(/*dom=*/RangeFromExtent(outer_mark->extent),
+                           /*var=*/iter_var->var.copy_with_suffix("_o"),
+                           /*iter_type=*/iter_var->iter_type);
       outer_bindings->push_back(NormalizeIterMapToExpr(outer_binding));
-      outer_iter_vars->push_back(iter_var);
-      continue;
+      outer_iter_vars->push_back(outer_iter);
     }
-    // create iter var for the outer block
-    IterVar outer_iter(/*dom=*/RangeFromExtent(outer_mark->extent),
-                       /*var=*/iter_var->var.copy_with_suffix("_o"),
-                       /*iter_type=*/iter_var->iter_type);
-    outer_bindings->push_back(NormalizeIterMapToExpr(outer_binding));
-    outer_iter_vars->push_back(outer_iter);
-    // create iter var for the inner block
-    IterVar inner_iter(/*dom=*/RangeFromExtent(inner_mark->extent),
-                       /*var=*/iter_var->var.copy_with_suffix("_i"),
-                       /*iter_type=*/iter_var->iter_type);
-    inner_bindings->push_back(NormalizeIterMapToExpr(inner_binding));
-    inner_iter_vars->push_back(inner_iter);
-    // substitution
     PrimExpr sub{nullptr};
-    if (is_one(outer_mark->extent)) {
-      sub = inner_iter->var;
+    if (is_one(inner_mark->extent)) {
+      // Skip inner var when extent is 1
+      // substitution
+      if (is_one(outer_mark->extent) && !preserve_unit_iters) {
+        // Simplify outer if not preserve_unit_iters
+        sub = outer_mark->extent - 1;

Review Comment:
   nit: is this equivalent to `make_zero(outer_mark.dtype()`? I feel this is 
more readable



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to