@@ -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));
0 commit comments