fixes for ZAM optimization of "switch" statements

This commit is contained in:
Vern Paxson 2024-01-14 09:06:25 -08:00 committed by Arne Welzel
parent 0dc587d1ad
commit 4bd0a46c29
2 changed files with 24 additions and 7 deletions

View file

@ -110,11 +110,14 @@ private:
template<typename T> template<typename T>
using CaseMapsI = std::vector<CaseMapI<T>>; using CaseMapsI = std::vector<CaseMapI<T>>;
template<typename T>
void AdjustSwitchTables(CaseMapsI<T>& abstract_cases);
template<typename T> template<typename T>
void ConcretizeSwitchTables(const CaseMapsI<T>& abstract_cases, CaseMaps<T>& concrete_cases); void ConcretizeSwitchTables(const CaseMapsI<T>& abstract_cases, CaseMaps<T>& concrete_cases);
template<typename T> template<typename T>
void DumpCases(const T& cases, const char* type_name) const; void DumpCases(const CaseMaps<T>& cases, const char* type_name) const;
void DumpInsts1(const FrameReMap* remappings); void DumpInsts1(const FrameReMap* remappings);
#include "zeek/ZAM-MethodDecls.h" #include "zeek/ZAM-MethodDecls.h"

View file

@ -264,6 +264,20 @@ void ZAMCompiler::AdjustBranches() {
if ( auto t = inst->target ) if ( auto t = inst->target )
inst->target = FindLiveTarget(t); inst->target = FindLiveTarget(t);
} }
// Fix up the implicit branches in switches, too.
AdjustSwitchTables(int_casesI);
AdjustSwitchTables(uint_casesI);
AdjustSwitchTables(double_casesI);
AdjustSwitchTables(str_casesI);
}
template<typename T>
void ZAMCompiler::AdjustSwitchTables(CaseMapsI<T>& abstract_cases) {
for ( auto& targs : abstract_cases ) {
for ( auto& targ : targs )
targ.second = FindLiveTarget(targ.second);
}
} }
void ZAMCompiler::RetargetBranches() { void ZAMCompiler::RetargetBranches() {
@ -386,14 +400,14 @@ void ZAMCompiler::Dump() {
inst->Dump(&frame_denizens, remappings); inst->Dump(&frame_denizens, remappings);
} }
DumpCases(int_casesI, "int"); DumpCases(int_cases, "int");
DumpCases(uint_casesI, "uint"); DumpCases(uint_cases, "uint");
DumpCases(double_casesI, "double"); DumpCases(double_cases, "double");
DumpCases(str_casesI, "str"); DumpCases(str_cases, "str");
} }
template<typename T> template<typename T>
void ZAMCompiler::DumpCases(const T& cases, const char* type_name) const { void ZAMCompiler::DumpCases(const CaseMaps<T>& cases, const char* type_name) const {
for ( auto i = 0U; i < cases.size(); ++i ) { for ( auto i = 0U; i < cases.size(); ++i ) {
printf("%s switch table #%d:", type_name, i); printf("%s switch table #%d:", type_name, i);
for ( auto& m : cases[i] ) { for ( auto& m : cases[i] ) {
@ -404,7 +418,7 @@ void ZAMCompiler::DumpCases(const T& cases, const char* type_name) const {
std::is_same_v<T, double> ) std::is_same_v<T, double> )
case_val = std::to_string(m.first); case_val = std::to_string(m.first);
printf(" %s->%d", case_val.c_str(), m.second->inst_num); printf(" %s->%d", case_val.c_str(), m.second);
} }
printf("\n"); printf("\n");
} }