Commit f1f9770b authored by Paul's avatar Paul
Browse files

Dont add all inputs as conflicts

parent 8a081fcf
......@@ -41,9 +41,8 @@ void dead_code_elimination::apply(program& p) const
// Skip the last instruction
if(i == last)
break;
// Skip instruction with empty shape as output unless its a builtin or undefined
if(i->get_shape().elements() == 0 and not(i->name().front() == '@') and
not(i->name() == "undefined"))
// Skip instruction with empty shape as output unless its a builtin or undefined or identity
if(i->get_shape().elements() == 0 and i->name().front() != '@' and i->name() != "undefined" and i->name() != "identity")
continue;
assert(bidistance(p, i, last) > 0);
fix([&](auto self, auto leaf) {
......
......@@ -274,7 +274,13 @@ struct stream_info
{
if(result[merge].size() <= stream)
result[merge].resize(stream + 1);
result[merge][stream].push_back(ins);
auto&& r = result[merge][stream];
r.push_back(ins);
// Copy inputs if they dont have a stream(and are not a builtin and context free)
// Inputs without a stream can have a implicit dependency
std::copy_if(ins->inputs().begin(), ins->inputs().end(), std::back_inserter(r), [&](auto x) {
return not this->has_stream(x) and not is_context_free(x->get_operator()) and x->name().front() != '@';
});
}
}
}
......@@ -380,9 +386,6 @@ void schedule::apply(program& p) const
{
auto args = merge.second[j];
args.insert(args.begin(), ins1);
// Add input arguments as a conflict
for(auto arg : merge.second[j])
args.insert(args.end(), arg->inputs().begin(), arg->inputs().end());
p.insert_instruction(merge.first, op::identity{}, args);
}
});
......
......@@ -240,9 +240,9 @@ TEST_CASE(zero_record)
auto one = p.add_literal(1);
auto onep1 = p.add_instruction(unary_op{}, one);
auto onep2 = p.add_instruction(unary_op{}, one);
auto binary = p.add_instruction(nary_op{},
p.add_instruction(migraphx::op::identity{}, onep1),
p.add_instruction(migraphx::op::identity{}, onep2));
auto onei1 = p.add_instruction(migraphx::op::identity{}, onep1);
auto onei2 = p.add_instruction(migraphx::op::identity{}, onep2);
auto binary = p.add_instruction(nary_op{}, onei1, onei2);
p.compile(t);
EXPECT(not t.has_stream(one));
EXPECT(t.get_stream(onep1) != t.get_stream(onep2));
......@@ -250,6 +250,7 @@ TEST_CASE(zero_record)
EXPECT(get_wait_for(binary) ==
get_wait_for(t.get_stream(binary), {t.get_stream(onep1), t.get_stream(onep2)}));
EXPECT(check_conflicts(p, onep1, onep2));
check_conflicts(p, {{onep1, onei1}, {onep2, onei2}});
}
TEST_CASE(zero_merge1)
......@@ -342,8 +343,8 @@ TEST_CASE(double_entry)
{
schedule_target t{};
migraphx::program p;
auto one = p.add_literal(1);
auto two = p.add_literal(2);
auto one = p.add_instruction(migraphx::op::identity{}, p.add_literal(1));
auto two = p.add_instruction(migraphx::op::identity{}, p.add_literal(2));
auto onep = p.add_instruction(unary_op{}, one);
auto twop = p.add_instruction(unary_op{}, two);
auto binary = p.add_instruction(nary_op{}, onep, twop);
......@@ -354,7 +355,7 @@ TEST_CASE(double_entry)
EXPECT(t.get_stream(binary) == 0);
EXPECT(get_wait_for(binary) ==
get_wait_for(t.get_stream(binary), {t.get_stream(onep), t.get_stream(twop)}));
EXPECT(check_conflicts(p, onep, twop));
check_conflicts(p, {{onep, one}, {twop, two}});
}
TEST_CASE(two_branches)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment