removal of unused functionality and some follow-on simplifications

This commit is contained in:
Vern Paxson 2023-06-16 16:16:13 -07:00 committed by Arne Welzel
parent ecc93606c4
commit b6b4a81e0d
9 changed files with 17 additions and 143 deletions

View file

@ -52,7 +52,6 @@ const char* stmt_name(StmtTag t)
"check-any-length",
"compiled-C++",
"ZAM",
"ZAM-resumption",
"null",
"assert",
};

View file

@ -31,7 +31,6 @@ enum StmtTag
STMT_CHECK_ANY_LEN, // internal reduced statement
STMT_CPP, // compiled C++
STMT_ZAM, // a ZAM function body
STMT_ZAM_RESUMPTION, // resumes ZAM execution for "when" statements
STMT_NULL,
STMT_ASSERT,
#define NUM_STMTS (int(STMT_ASSERT) + 1)

View file

@ -138,7 +138,6 @@ public:
std::shared_ptr<ProfileFunc> ProfilePtr() const { return pf; }
void SetBody(StmtPtr new_body) { body = std::move(new_body); }
// void SetProfile(std::shared_ptr<ProfileFunc> _pf);
void SetProfile(std::shared_ptr<ProfileFunc> _pf) { pf = std::move(_pf); }
// The following provide a way of marking FuncInfo's as

View file

@ -927,47 +927,6 @@ const ZInstI* ZAMCompiler::EndOfLoop(const ZInstI* inst, int depth) const
return insts1[i];
}
bool ZAMCompiler::VarIsAssigned(int slot) const
{
for ( auto& inst : insts1 )
if ( inst->live && VarIsAssigned(slot, inst) )
return true;
return false;
}
bool ZAMCompiler::VarIsAssigned(int slot, const ZInstI* i) const
{
// Special-case for table iterators, which assign to a bunch
// of variables but they're not immediately visible in the
// instruction layout.
if ( i->op == OP_NEXT_TABLE_ITER_VAL_VAR_VVV || i->op == OP_NEXT_TABLE_ITER_VV )
{
auto& iter_vars = i->aux->loop_vars;
for ( auto v : iter_vars )
if ( v == slot )
return true;
if ( i->op != OP_NEXT_TABLE_ITER_VAL_VAR_VVV )
return false;
// Otherwise fall through, since that flavor of iterate
// *does* also assign to slot 1.
}
if ( i->op == OP_NEXT_VECTOR_ITER_VAL_VAR_VVVV && i->v2 == slot )
return true;
if ( i->op_type == OP_VV_FRAME )
// We don't want to consider these as assigning to the
// variable, since the point of this method is to figure
// out which variables don't need storing to the frame
// because their internal value is never modified.
return false;
return i->AssignsToSlot1() && i->v1 == slot;
}
bool ZAMCompiler::VarIsUsed(int slot) const
{
for ( auto& inst : insts1 )

View file

@ -459,14 +459,6 @@ private:
const ZInstI* BeginningOfLoop(const ZInstI* inst, int depth) const;
const ZInstI* EndOfLoop(const ZInstI* inst, int depth) const;
// True if any statement other than a frame sync assigns to the
// given slot.
bool VarIsAssigned(int slot) const;
// True if the given statement assigns to the given slot, and
// it's not a frame sync.
bool VarIsAssigned(int slot, const ZInstI* i) const;
// True if any statement other than a frame sync uses the given slot.
bool VarIsUsed(int slot) const;

View file

@ -33,20 +33,9 @@ void ZAMCompiler::Init()
{
InitGlobals();
InitArgs();
InitCaptures();
InitLocals();
#if 0
// Complain about unused aggregates ... but not if we're inlining,
// as that can lead to optimizations where they wind up being unused
// but the original logic for using them was sound.
if ( ! analysis_options.inliner )
for ( auto a : pf->Inits() )
{
if ( pf->Locals().find(a) == pf->Locals().end() )
reporter->Warning("%s unused", a->Name());
}
#endif
TrackMemoryManagement();
non_recursive = non_recursive_funcs.count(func) > 0;
@ -216,11 +205,6 @@ StmtPtr ZAMCompiler::CompileBody()
// Could erase insts1 here to recover memory, but it's handy
// for debugging.
#if 0
if ( non_recursive )
func->UseStaticFrame();
#endif
auto zb = make_intrusive<ZBody>(func->Name(), this);
zb->SetInsts(insts2);

View file

@ -1109,19 +1109,6 @@ const ZAMStmt ZAMCompiler::DoCall(const CallExpr* c, const NameExpr* n)
z.func = func_id->GetVal()->AsFunc();
}
if ( n )
{
auto id = n->Id();
if ( id->IsGlobal() )
{
AddInst(z);
auto global_slot = global_id_to_info[id];
z = ZInstI(OP_STORE_GLOBAL_V, global_slot);
z.op_type = OP_V_I1;
z.t = globalsI[global_slot].id->GetType();
}
}
return AddInst(z);
}

View file

@ -193,10 +193,10 @@ ZBody::~ZBody()
void ZBody::SetInsts(vector<ZInst*>& _insts)
{
ninst = _insts.size();
auto insts_copy = new ZInst[ninst];
end_pc = _insts.size();
auto insts_copy = new ZInst[end_pc];
for ( auto i = 0U; i < ninst; ++i )
for ( auto i = 0U; i < end_pc; ++i )
insts_copy[i] = *_insts[i];
insts = insts_copy;
@ -206,10 +206,10 @@ void ZBody::SetInsts(vector<ZInst*>& _insts)
void ZBody::SetInsts(vector<ZInstI*>& instsI)
{
ninst = instsI.size();
auto insts_copy = new ZInst[ninst];
end_pc = instsI.size();
auto insts_copy = new ZInst[end_pc];
for ( auto i = 0U; i < ninst; ++i )
for ( auto i = 0U; i < end_pc; ++i )
{
auto& iI = *instsI[i];
insts_copy[i] = iI;
@ -228,7 +228,7 @@ void ZBody::InitProfile()
{
inst_count = new vector<int>;
inst_CPU = new vector<double>;
for ( auto i = 0U; i < ninst; ++i )
for ( auto i = 0U; i < end_pc; ++i )
{
inst_count->push_back(0);
inst_CPU->push_back(0.0);
@ -245,7 +245,7 @@ ValPtr ZBody::Exec(Frame* f, StmtFlowType& flow)
double t = analysis_options.profile_ZAM ? util::curr_CPU_time() : 0.0;
#endif
auto val = DoExec(f, 0, flow);
auto val = DoExec(f, flow);
#ifdef DEBUG
if ( analysis_options.profile_ZAM )
@ -255,10 +255,9 @@ ValPtr ZBody::Exec(Frame* f, StmtFlowType& flow)
return val;
}
ValPtr ZBody::DoExec(Frame* f, int start_pc, StmtFlowType& flow)
ValPtr ZBody::DoExec(Frame* f, StmtFlowType& flow)
{
int pc = start_pc;
const int end_pc = ninst;
int pc = 0;
// Return value, or nil if none.
const ZVal* ret_u = nullptr;
@ -293,6 +292,9 @@ ValPtr ZBody::DoExec(Frame* f, int start_pc, StmtFlowType& flow)
flow = FLOW_RETURN; // can be over-written by a Hook-Break
// Clear any leftover error state.
ZAM_error = false;
while ( pc < end_pc && ! ZAM_error )
{
auto& z = insts[pc];
@ -369,9 +371,6 @@ ValPtr ZBody::DoExec(Frame* f, int start_pc, StmtFlowType& flow)
delete[] frame;
}
// Clear any error state.
ZAM_error = false;
return result;
}
@ -449,7 +448,7 @@ void ZBody::Dump() const
printf("Final code:\n");
for ( unsigned i = 0; i < ninst; ++i )
for ( unsigned i = 0; i < end_pc; ++i )
{
auto& inst = insts[i];
printf("%d: ", i);
@ -472,25 +471,6 @@ TraversalCode ZBody::Traverse(TraversalCallback* cb) const
HANDLE_TC_STMT_POST(tc);
}
ValPtr ZAMResumption::Exec(Frame* f, StmtFlowType& flow)
{
return am->DoExec(f, xfer_pc, flow);
}
void ZAMResumption::StmtDescribe(ODesc* d) const
{
d->Add("<resumption of compiled code>");
}
TraversalCode ZAMResumption::Traverse(TraversalCallback* cb) const
{
TraversalCode tc = cb->PreStmt(this);
HANDLE_TC_STMT_PRE(tc);
tc = cb->PostStmt(this);
HANDLE_TC_STMT_POST(tc);
}
// Unary vector operation of v1 <vec-op> v2.
static void vec_exec(ZOp op, TypePtr t, VectorVal*& v1, const VectorVal* v2, const ZInst& z)
{

View file

@ -52,12 +52,10 @@ public:
void ProfileExecution() const;
protected:
friend class ZAMResumption;
// Initializes profiling information, if needed.
void InitProfile();
ValPtr DoExec(Frame* f, int start_pc, StmtFlowType& flow);
ValPtr DoExec(Frame* f, StmtFlowType& flow);
// Run-time checking for "any" type being consistent with
// expected typed. Returns true if the type match is okay.
@ -73,7 +71,7 @@ private:
const char* func_name = nullptr;
const ZInst* insts = nullptr;
unsigned int ninst = 0;
unsigned int end_pc = 0;
FrameReMap frame_denizens;
int frame_size;
@ -117,29 +115,6 @@ private:
CaseMaps<std::string> str_cases;
};
// This is a statement that resumes execution into a code block in a
// ZBody. Used for deferred execution for "when" statements.
class ZAMResumption : public Stmt
{
public:
ZAMResumption(ZBody* _am, int _xfer_pc) : Stmt(STMT_ZAM_RESUMPTION), am(_am), xfer_pc(_xfer_pc)
{
}
ValPtr Exec(Frame* f, StmtFlowType& flow) override;
StmtPtr Duplicate() override { return {NewRef{}, this}; }
void StmtDescribe(ODesc* d) const override;
protected:
TraversalCode Traverse(TraversalCallback* cb) const override;
ZBody* am;
int xfer_pc = 0;
};
// Prints the execution profile.
extern void report_ZOP_profile();