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>
using CaseMapsI = std::vector<CaseMapI<T>>;
template<typename T>
void AdjustSwitchTables(CaseMapsI<T>& abstract_cases);
template<typename T>
void ConcretizeSwitchTables(const CaseMapsI<T>& abstract_cases, CaseMaps<T>& concrete_cases);
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);
#include "zeek/ZAM-MethodDecls.h"

View file

@ -264,6 +264,20 @@ void ZAMCompiler::AdjustBranches() {
if ( auto t = inst->target )
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() {
@ -386,14 +400,14 @@ void ZAMCompiler::Dump() {
inst->Dump(&frame_denizens, remappings);
}
DumpCases(int_casesI, "int");
DumpCases(uint_casesI, "uint");
DumpCases(double_casesI, "double");
DumpCases(str_casesI, "str");
DumpCases(int_cases, "int");
DumpCases(uint_cases, "uint");
DumpCases(double_cases, "double");
DumpCases(str_cases, "str");
}
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 ) {
printf("%s switch table #%d:", type_name, 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> )
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");
}