From 832546d694add906117a9e213cb113a999561c37 Mon Sep 17 00:00:00 2001 From: Volodymyr Kysenko Date: Fri, 1 Sep 2023 11:06:09 -0700 Subject: [PATCH 1/4] Iterate over lets in correct order --- src/VectorizeLoops.cpp | 16 ++++++++++----- test/correctness/vectorize_nested.cpp | 28 +++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/VectorizeLoops.cpp b/src/VectorizeLoops.cpp index f5ad0d573b9a..3554abf523cc 100644 --- a/src/VectorizeLoops.cpp +++ b/src/VectorizeLoops.cpp @@ -962,17 +962,23 @@ class VectorSubs : public IRMutator { update_replacements(); // Go over lets which were vectorized and update them according to the current // loop level. - for (auto it = scope.cbegin(); it != scope.cend(); ++it) { - string vectorized_name = get_widened_var_name(it.name()); - Expr vectorized_value = mutate(it.value()); + for (auto let = containing_lets.begin(); let != containing_lets.end(); let++) { + if (!scope.contains(let->first)) { + continue; + } + string vectorized_name = get_widened_var_name(let->first); + Expr vectorized_value = mutate(scope.get(let->first)); vector_scope.push(vectorized_name, vectorized_value); } body = mutate(body); // Append vectorized lets for this loop level. - for (auto it = scope.cbegin(); it != scope.cend(); ++it) { - string vectorized_name = get_widened_var_name(it.name()); + for (auto let = containing_lets.rbegin(); let != containing_lets.rend(); let++) { + if (!scope.contains(let->first)) { + continue; + } + string vectorized_name = get_widened_var_name(let->first); Expr vectorized_value = vector_scope.get(vectorized_name); vector_scope.pop(vectorized_name); InterleavedRamp ir; diff --git a/test/correctness/vectorize_nested.cpp b/test/correctness/vectorize_nested.cpp index dd4cfd3905c0..e9800ef8f034 100644 --- a/test/correctness/vectorize_nested.cpp +++ b/test/correctness/vectorize_nested.cpp @@ -192,6 +192,29 @@ int vectorize_all_d() { return 0; } +int vectorize_lets_order() { + const int width = 128; + const int height = 128; + + Var x("x"), y("y"), yo("yo"), yi("yi"), yoi("yoi"), yoio("yoio"), yoii("yoii"); + Func f("f"); + f(x, y) = x + y; + f.split(y, yo, yi, 8, TailStrategy::Auto) + .split(yo, yo, yoi, 4, TailStrategy::RoundUp) + .vectorize(yoi) + .vectorize(yi) + .split(yoi, yoio, yoii, 2, TailStrategy::Auto); + Buffer result = f.realize({width, height}); + + auto cmp_func = [](int x, int y) { + return x + y; + }; + if (check_image(result, cmp_func)) { + return 1; + } + + return 0; +} int vectorize_inner_of_scalarization() { ImageParam in(UInt(8), 2); @@ -289,6 +312,11 @@ int main(int argc, char **argv) { return 1; } + if (vectorize_lets_order()) { + printf("vectorize_lets_order failed\n"); + return 1; + } + if (vectorize_inner_of_scalarization()) { printf("vectorize_inner_of_scalarization failed\n"); return 1; From 4c1d971be834a6c611b2175883ee21aab483feaa Mon Sep 17 00:00:00 2001 From: Volodymyr Kysenko Date: Fri, 1 Sep 2023 11:21:13 -0700 Subject: [PATCH 2/4] Comments --- src/VectorizeLoops.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/VectorizeLoops.cpp b/src/VectorizeLoops.cpp index 3554abf523cc..5e9280aa1c12 100644 --- a/src/VectorizeLoops.cpp +++ b/src/VectorizeLoops.cpp @@ -960,9 +960,10 @@ class VectorSubs : public IRMutator { vectorized_vars.push_back({op->name, min, (int)extent_int->value}); update_replacements(); - // Go over lets which were vectorized and update them according to the current - // loop level. + // Go over lets which were vectorized in order of occurance and update them according + // to the current loop level. for (auto let = containing_lets.begin(); let != containing_lets.end(); let++) { + // Skip if this var wasn't vectorized. if (!scope.contains(let->first)) { continue; } @@ -975,6 +976,7 @@ class VectorSubs : public IRMutator { // Append vectorized lets for this loop level. for (auto let = containing_lets.rbegin(); let != containing_lets.rend(); let++) { + // Skip if this var wasn't vectorized. if (!scope.contains(let->first)) { continue; } From 10969995a2e910575ff3a4005eb52719ed7bf76c Mon Sep 17 00:00:00 2001 From: Volodymyr Kysenko Date: Fri, 1 Sep 2023 11:23:25 -0700 Subject: [PATCH 3/4] Comments --- src/VectorizeLoops.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VectorizeLoops.cpp b/src/VectorizeLoops.cpp index 5e9280aa1c12..99f2369c5936 100644 --- a/src/VectorizeLoops.cpp +++ b/src/VectorizeLoops.cpp @@ -960,8 +960,8 @@ class VectorSubs : public IRMutator { vectorized_vars.push_back({op->name, min, (int)extent_int->value}); update_replacements(); - // Go over lets which were vectorized in order of occurance and update them according - // to the current loop level. + // Go over lets which were vectorized in the order of their occurance and update + // them according to the current loop level. for (auto let = containing_lets.begin(); let != containing_lets.end(); let++) { // Skip if this var wasn't vectorized. if (!scope.contains(let->first)) { From 11a60e785b0610dcf682bce1e9faf7f18c119128 Mon Sep 17 00:00:00 2001 From: Volodymyr Kysenko Date: Fri, 1 Sep 2023 11:30:00 -0700 Subject: [PATCH 4/4] Comments --- src/VectorizeLoops.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/VectorizeLoops.cpp b/src/VectorizeLoops.cpp index 99f2369c5936..46a8553e91d2 100644 --- a/src/VectorizeLoops.cpp +++ b/src/VectorizeLoops.cpp @@ -960,7 +960,7 @@ class VectorSubs : public IRMutator { vectorized_vars.push_back({op->name, min, (int)extent_int->value}); update_replacements(); - // Go over lets which were vectorized in the order of their occurance and update + // Go over lets which were vectorized in the order of their occurrence and update // them according to the current loop level. for (auto let = containing_lets.begin(); let != containing_lets.end(); let++) { // Skip if this var wasn't vectorized.