Skip to content

Commit bc2d0eb

Browse files
ericastorcopybara-github
authored andcommitted
[opt] [xlscc] Refactor DataFlowLazyNodeInfo::MergeInfos to reduce copies
The `MergeInfos` method in DataFlowLazyNodeInfo now takes a Span of Spans, instead of a flat `absl::Span<const Info>`. This avoids creating large temporary vectors by allowing merging across multiple input spans directly. PiperOrigin-RevId: 887004771
1 parent 94bbfa6 commit bc2d0eb

4 files changed

Lines changed: 38 additions & 27 deletions

File tree

xls/contrib/xlscc/continuations.cc

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -197,10 +197,12 @@ xls::LeafTypeTree<ParamSet> SourcesSetNodeInfo::ComputeInfoTreeForNode(
197197
}
198198

199199
ParamSet SourcesSetNodeInfo::MergeInfos(
200-
const absl::Span<const ParamSet>& infos) const {
200+
absl::Span<const absl::Span<const ParamSet>> spans) const {
201201
ParamSet ret;
202-
for (const ParamSet& info : infos) {
203-
ret.insert(info.begin(), info.end());
202+
for (const auto& span : spans) {
203+
for (const ParamSet& info : span) {
204+
ret.insert(info.begin(), info.end());
205+
}
204206
}
205207
return ret;
206208
}
@@ -239,10 +241,12 @@ xls::LeafTypeTree<NodeSourceSet> SourcesSetTreeNodeInfo::ComputeInfoTreeForNode(
239241
}
240242

241243
NodeSourceSet SourcesSetTreeNodeInfo::MergeInfos(
242-
const absl::Span<const NodeSourceSet>& infos) const {
244+
absl::Span<const absl::Span<const NodeSourceSet>> spans) const {
243245
NodeSourceSet ret;
244-
for (const NodeSourceSet& info : infos) {
245-
ret.insert(info.begin(), info.end());
246+
for (const auto& span : spans) {
247+
for (const NodeSourceSet& info : span) {
248+
ret.insert(info.begin(), info.end());
249+
}
246250
}
247251
return ret;
248252
}

xls/contrib/xlscc/translator_types.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1266,7 +1266,7 @@ class SourcesSetNodeInfo
12661266
xls::Node* node) const override final;
12671267

12681268
ParamSet MergeInfos(
1269-
const absl::Span<const ParamSet>& infos) const override final;
1269+
absl::Span<const absl::Span<const ParamSet>> spans) const override final;
12701270
};
12711271

12721272
typedef absl::flat_hash_set<xls::NodeSource> NodeSourceSet;
@@ -1291,8 +1291,8 @@ class SourcesSetTreeNodeInfo
12911291
xls::LeafTypeTree<NodeSourceSet> ComputeInfoTreeForNode(
12921292
xls::Node* node) const override final;
12931293

1294-
NodeSourceSet MergeInfos(
1295-
const absl::Span<const NodeSourceSet>& infos) const override final;
1294+
NodeSourceSet MergeInfos(absl::Span<const absl::Span<const NodeSourceSet>>
1295+
spans) const override final;
12961296
};
12971297

12981298
class OptimizationContext {

xls/passes/data_flow_node_info.h

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@ class DataFlowLazyNodeInfo : public LazyNodeInfo<Info> {
8181
// Only used if compute_tree_for_source = true.
8282
virtual xls::LeafTypeTree<Info> ComputeInfoTreeForNode(Node* node) const = 0;
8383

84-
virtual Info MergeInfos(const absl::Span<const Info>& infos) const = 0;
84+
virtual Info MergeInfos(
85+
absl::Span<const absl::Span<const Info>> spans) const = 0;
8586

8687
explicit DataFlowLazyNodeInfo(bool compute_tree_for_source,
8788
bool default_info_source,
@@ -115,7 +116,7 @@ class DataFlowLazyNodeInfo : public LazyNodeInfo<Info> {
115116

116117
Info GetSingleInfoForNode(Node* node) {
117118
SharedLeafTypeTree<Info> info = LazyNodeInfo<Info>::GetInfo(node);
118-
return MergeInfos(info.elements());
119+
return MergeInfos({info.elements()});
119120
}
120121

121122
private:
@@ -409,16 +410,15 @@ class DataFlowLazyNodeInfo : public LazyNodeInfo<Info> {
409410
ret = ComputeInfoForNode(node);
410411
} else {
411412
// Merge all operand infos
412-
absl::InlinedVector<Info, 1> infos_in;
413+
absl::InlinedVector<absl::Span<const Info>, 1> spans;
414+
spans.reserve(operand_infos_out.size());
413415
for (int64_t op = 0; op < operand_infos_out.size(); ++op) {
414-
for (int64_t i = 0; i < operand_infos_out[op]->elements().size(); ++i) {
415-
infos_in.push_back(operand_infos_out[op]->elements()[i]);
416-
}
416+
spans.push_back(operand_infos_out[op]->elements());
417417
}
418418

419-
CHECK(!infos_in.empty());
419+
CHECK(!spans.empty());
420420

421-
ret = MergeInfos(infos_in);
421+
ret = MergeInfos(spans);
422422
}
423423

424424
absl::InlinedVector<Info, 1> infos;
@@ -528,12 +528,15 @@ class DataFlowLazyNodeInfo : public LazyNodeInfo<Info> {
528528
}
529529

530530
absl::InlinedVector<Info, 1> infos_out;
531+
absl::InlinedVector<absl::Span<const Info>, 1> spans_this_elem;
532+
spans_this_elem.reserve(operand_infos.size());
531533
for (int64_t e = 0; e < first_info->elements().size(); ++e) {
532-
absl::InlinedVector<Info, 1> infos_this_elem;
534+
spans_this_elem.clear();
533535
for (int64_t op = 0; op < operand_infos.size(); ++op) {
534-
infos_this_elem.push_back(operand_infos.at(op)->elements().at(e));
536+
spans_this_elem.push_back(
537+
operand_infos.at(op)->elements().subspan(e, 1));
535538
}
536-
infos_out.push_back(MergeInfos(infos_this_elem));
539+
infos_out.push_back(MergeInfos(spans_this_elem));
537540
}
538541
return LeafTypeTree<Info>::CreateFromVector(first_info->type(),
539542
std::move(infos_out));

xls/passes/data_flow_node_info_test.cc

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,12 @@ class TestParamCountInfo
6969
return xls::LeafTypeTree<int64_t>();
7070
}
7171
int64_t MergeInfos(
72-
const absl::Span<const int64_t>& infos) const override final {
72+
absl::Span<const absl::Span<const int64_t>> spans) const override final {
7373
int64_t result = 0;
74-
for (int64_t info : infos) {
75-
result += info;
74+
for (const auto& span : spans) {
75+
for (int64_t info : span) {
76+
result += info;
77+
}
7678
}
7779
return result;
7880
}
@@ -116,11 +118,13 @@ class TestNodeSourceInfo
116118
return result;
117119
}
118120

119-
NodeSourceSet MergeInfos(
120-
const absl::Span<const NodeSourceSet>& infos) const override final {
121+
NodeSourceSet MergeInfos(absl::Span<const absl::Span<const NodeSourceSet>>
122+
spans) const override final {
121123
NodeSourceSet ret;
122-
for (const NodeSourceSet& info : infos) {
123-
ret.insert(info.begin(), info.end());
124+
for (const auto& span : spans) {
125+
for (const NodeSourceSet& info : span) {
126+
ret.insert(info.begin(), info.end());
127+
}
124128
}
125129
return ret;
126130
}

0 commit comments

Comments
 (0)