Skip to content

Commit

Permalink
Update the list of fused_pairs and run validate_fused_group for speci…
Browse files Browse the repository at this point in the history
…alization definitions too.

Fixes #6763.
  • Loading branch information
vksnk committed May 17, 2022
1 parent 4ab4ad9 commit d2dbb58
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 0 deletions.
6 changes: 6 additions & 0 deletions src/RealizationOrder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -163,9 +163,15 @@ void populate_fused_pairs_list(const string &func, const Definition &def,
func, stage_index, fuse_level.var().name());
if (fuse_level.stage_index() == 0) {
parent.definition().schedule().fused_pairs().push_back(pair);
for (int i = 0; i < parent.definition().specializations().size(); i++) {
parent.definition().specializations()[i].definition.schedule().fused_pairs().push_back(pair);
}
} else {
internal_assert(fuse_level.stage_index() > 0);
parent.update(fuse_level.stage_index() - 1).schedule().fused_pairs().push_back(pair);
for (int i = 0; i < parent.update(fuse_level.stage_index() - 1).specializations().size(); i++) {
parent.update(fuse_level.stage_index() - 1).specializations()[i].definition.schedule().fused_pairs().push_back(pair);
}
}
}

Expand Down
8 changes: 8 additions & 0 deletions src/ScheduleFunctions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2369,9 +2369,17 @@ void validate_fused_groups_schedule(const vector<vector<string>> &fused_groups,

validate_fused_group_schedule_helper(
iter->first, 0, iter->second.definition(), env);
for (size_t i = 0; i < iter->second.definition().specializations().size(); i++) {
validate_fused_group_schedule_helper(
iter->first, 0, iter->second.definition().specializations()[i].definition, env);
}
for (size_t i = 0; i < iter->second.updates().size(); ++i) {
validate_fused_group_schedule_helper(
iter->first, i + 1, iter->second.updates()[i], env);
for (size_t i = 0; i < iter->second.updates()[i].specializations().size(); i++) {
validate_fused_group_schedule_helper(
iter->first, i + 1, iter->second.updates()[i].specializations()[i].definition, env);
}
}
}
}
Expand Down
1 change: 1 addition & 0 deletions test/error/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ tests(GROUPS error
clamp_out_of_range.cpp
compute_with_crossing_edges1.cpp
compute_with_crossing_edges2.cpp
compute_with_fuse_in_specialization.cpp
constrain_wrong_output_buffer.cpp
constraint_uses_non_param.cpp
define_after_realize.cpp
Expand Down
22 changes: 22 additions & 0 deletions test/error/compute_with_fuse_in_specialization.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#include "Halide.h"
#include <stdio.h>

using namespace Halide;

int main(int argc, char **argv) {
Var x("x"), y("y"), f("f");
ImageParam in(Int(16), 2, "in");
Func out0("out0"), out1("out1");
out0(x, y) = 1 * in(x, y);
out1(x, y) = 2 * in(x, y);

out0.vectorize(x, 8, TailStrategy::RoundUp);
out1.vectorize(x, 8, TailStrategy::RoundUp).compute_with(out0, x);

out0.specialize(in.dim(1).stride() == 128).fuse(x, y, f);
Pipeline p({out0, out1});
p.compile_jit();

printf("Success!\n");
return 0;
}

0 comments on commit d2dbb58

Please sign in to comment.