diff --git a/xls/contrib/xlscc/continuations.cc b/xls/contrib/xlscc/continuations.cc index 9b242c1efb..9b6d4d258d 100644 --- a/xls/contrib/xlscc/continuations.cc +++ b/xls/contrib/xlscc/continuations.cc @@ -280,14 +280,18 @@ OptimizationContext::GetSourcesSetTreeNodeInfoForFunction( absl::StatusOr OptimizationContext::CheckNodeSourcesInSet( xls::FunctionBase* in_function, xls::Node* node, - absl::flat_hash_set sources_set) { + absl::flat_hash_set sources_set, + bool allow_empty_sources_result) { // Save lazy node analysis for each function for efficiency XLS_ASSIGN_OR_RETURN(SourcesSetNodeInfo * info, GetSourcesSetNodeInfoForFunction(in_function)); ParamSet param_sources = info->GetSingleInfoForNode(node); - // No param sources will return true + if (param_sources.empty()) { + return allow_empty_sources_result; + } + bool all_in_set = true; for (const xls::Param* param : param_sources) { CHECK_EQ(param->function_base(), in_function); @@ -2090,10 +2094,14 @@ absl::Status Translator::MarkDirectIns(GeneratedFunction& func, continue; } + // Don't count things that don't actually use any direct-ins as direct-in, + // for example literals. Allow literal substitution pass to prevent these + // from being stored in state elements. XLS_ASSIGN_OR_RETURN( continuation_out.direct_in, context.CheckNodeSourcesInSet( - slice.function, continuation_out.output_node, direct_in_sources)); + slice.function, continuation_out.output_node, direct_in_sources, + /*allow_empty_sources_result=*/false)); } first_slice = false; diff --git a/xls/contrib/xlscc/generate_fsm.cc b/xls/contrib/xlscc/generate_fsm.cc index 1e2d9b7f57..0930292d3f 100644 --- a/xls/contrib/xlscc/generate_fsm.cc +++ b/xls/contrib/xlscc/generate_fsm.cc @@ -539,6 +539,9 @@ absl::Status NewFSMGenerator::LayoutValuesToSaveForNewFSMStates( if (key.value->direct_in) { continue; } + if (key.value->literal.has_value()) { + continue; + } state.values_to_save.insert(key.value); } } diff --git a/xls/contrib/xlscc/translator_types.h b/xls/contrib/xlscc/translator_types.h index 277a5752f6..d673d4545e 100644 --- a/xls/contrib/xlscc/translator_types.h +++ b/xls/contrib/xlscc/translator_types.h @@ -1304,7 +1304,8 @@ class OptimizationContext { absl::StatusOr CheckNodeSourcesInSet( xls::FunctionBase* in_function, xls::Node* node, - absl::flat_hash_set sources_set); + absl::flat_hash_set sources_set, + bool allow_empty_sources_result = true); private: absl::flat_hash_map> diff --git a/xls/contrib/xlscc/unit_tests/continuations_test.cc b/xls/contrib/xlscc/unit_tests/continuations_test.cc index 1d9239864a..0b9903e57d 100644 --- a/xls/contrib/xlscc/unit_tests/continuations_test.cc +++ b/xls/contrib/xlscc/unit_tests/continuations_test.cc @@ -1060,9 +1060,9 @@ TEST_F(ContinuationsTest, PipelinedLoopBackwardsPropagation) { EXPECT_EQ(SliceInputsDeclCount(third_slice, "i"), 2); EXPECT_EQ(SliceInputsDeclCount(third_slice, "a"), 2); - EXPECT_TRUE(SliceInputsDecl(third_slice, "a", /*direct_in=*/true, + EXPECT_TRUE(SliceInputsDecl(third_slice, "a", /*direct_in=*/false, /*is_feedback=*/false, /*func=*/func)); - EXPECT_TRUE(SliceInputsDecl(third_slice, "i", /*direct_in=*/true, + EXPECT_TRUE(SliceInputsDecl(third_slice, "i", /*direct_in=*/false, /*is_feedback=*/false, /*func=*/func)); EXPECT_TRUE(SliceInputsDecl(third_slice, "a", /*direct_in=*/false, /*is_feedback=*/true, /*func=*/func)); @@ -1322,9 +1322,9 @@ TEST_F(ContinuationsTest, PipelinedLoopNothingOutside) { ++slice_it; const xlscc::GeneratedFunctionSlice& third_slice = *slice_it; - EXPECT_TRUE(SliceOutputsDecl(first_slice, "a", /*direct_in*/ true)); - EXPECT_TRUE(SliceOutputsDecl(first_slice, "i", /*direct_in*/ true)); - EXPECT_TRUE(SliceOutputsDecl(first_slice, "c", /*direct_in*/ true)); + EXPECT_TRUE(SliceOutputsDecl(first_slice, "a", /*direct_in*/ false)); + EXPECT_TRUE(SliceOutputsDecl(first_slice, "i", /*direct_in*/ false)); + EXPECT_TRUE(SliceOutputsDecl(first_slice, "c", /*direct_in*/ false)); EXPECT_FALSE(SliceInputsDecl(second_slice, "i")); EXPECT_FALSE(SliceInputsDecl(second_slice, "a")); @@ -2131,8 +2131,8 @@ TEST_F(ContinuationsTest, PipelinedLoopBackwardsPropagationInSubroutine) { const xlscc::GeneratedFunctionSlice& fourth_slice = *slice_it; EXPECT_TRUE(SliceOutputsDecl(second_slice, "ctrl")); - EXPECT_TRUE(SliceOutputsDecl(second_slice, "a", /*direct_in=*/true)); - EXPECT_TRUE(SliceOutputsDecl(second_slice, "i", /*direct_in=*/true)); + EXPECT_TRUE(SliceOutputsDecl(second_slice, "a", /*direct_in=*/false)); + EXPECT_TRUE(SliceOutputsDecl(second_slice, "i", /*direct_in=*/false)); EXPECT_EQ(SliceInputsDeclCount(third_slice, "i"), 2); EXPECT_EQ(SliceInputsDeclCount(third_slice, "a"), 2); @@ -2420,15 +2420,12 @@ TEST_F(ContinuationsTest, ContinuationLiteralDecomposed) { ++slice_it; const xlscc::GeneratedFunctionSlice& second_slice = *slice_it; - // TODO(seanhaskell): Calling literals direct-in is stopped them from being - // decomposed. This makes loops less efficient - - EXPECT_TRUE(SliceInputsDecl(second_slice, "x", /*direct_in=*/true, + EXPECT_TRUE(SliceInputsDecl(second_slice, "x", /*direct_in=*/false, /*is_feedback=*/false, /*func=*/func, - /*decl_index=*/-1)); + /*decl_index=*/0)); EXPECT_TRUE(SliceInputsDecl(second_slice, "x", /*direct_in=*/false, /*is_feedback=*/true, /*func=*/func, - /*decl_index=*/-1)); + /*decl_index=*/0)); } TEST_F(ContinuationsTest, StaticThisDecomposed) {