From 2ba39b25f1a2c8f821a903cbceb28afad3da416c Mon Sep 17 00:00:00 2001 From: Geza Lore Date: Fri, 2 Sep 2022 11:29:02 +0100 Subject: [PATCH] Replace dynamic_casts with static_casts dynamic_cast is not free. Replace obvious instances (where the result is unconditionally dereferenced) with static_cast in contexts with performance implications. --- src/V3Gate.cpp | 14 +++++++------- src/V3Order.cpp | 14 +++++++------- src/V3VariableOrder.cpp | 6 +++--- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/V3Gate.cpp b/src/V3Gate.cpp index 88a9332d4..726bbbfa8 100644 --- a/src/V3Gate.cpp +++ b/src/V3Gate.cpp @@ -107,7 +107,7 @@ public: VNUser iterateInEdges(GateGraphBaseVisitor& v, VNUser vu = VNUser(0)) { VNUser ret = VNUser(0); for (V3GraphEdge* edgep = inBeginp(); edgep; edgep = edgep->inNextp()) { - ret = dynamic_cast(edgep->fromp())->accept(v, vu); + ret = static_cast(edgep->fromp())->accept(v, vu); } return ret; } @@ -121,7 +121,7 @@ public: for (V3GraphEdge* edgep = outBeginp(); edgep; edgep = next_edgep) { // Need to find the next edge before visiting in case the edge is deleted next_edgep = edgep->outNextp(); - ret = dynamic_cast(edgep->top())->accept(v, vu); + ret = static_cast(edgep->top())->accept(v, vu); } return ret; } @@ -683,7 +683,7 @@ bool GateVisitor::elimLogicOkOutputs(GateLogicVertex* consumeVertexp, varscopes.insert(vscp); } for (V3GraphEdge* edgep = consumeVertexp->outBeginp(); edgep; edgep = edgep->outNextp()) { - const GateVarVertex* const consVVertexp = dynamic_cast(edgep->top()); + const GateVarVertex* const consVVertexp = static_cast(edgep->top()); AstVarScope* const vscp = consVVertexp->varScp(); if (varscopes.find(vscp) != varscopes.end()) { UINFO(9, " Block-unopt, insertion generates input vscp " << vscp << endl); @@ -764,8 +764,8 @@ void GateVisitor::consumedMove() { if (!vvertexp->consumed() && !vvertexp->user()) { UINFO(8, "Unconsumed " << vvertexp->varScp() << endl); } - } - if (const GateLogicVertex* const lvertexp = dynamic_cast(vertexp)) { + } else { + const GateLogicVertex* const lvertexp = static_cast(vertexp); AstNode* const nodep = lvertexp->nodep(); const AstActive* const oldactp = lvertexp->activep(); // nullptr under cfunc if (!lvertexp->consumed() && oldactp) { @@ -1108,7 +1108,7 @@ private: // Replace all of this varvertex's consumers with dupVarRefp for (V3GraphEdge* outedgep = vvertexp->outBeginp(); outedgep;) { const GateLogicVertex* const consumeVertexp - = dynamic_cast(outedgep->top()); + = static_cast(outedgep->top()); AstNode* const consumerp = consumeVertexp->nodep(); // if (debug() >= 9) m_graphp->dumpDotFilePrefixed("gate_preelim"); UINFO(9, @@ -1283,7 +1283,7 @@ private: V3GraphEdge* oedgep = ledgep; ledgep = ledgep->inNextp(); GateEitherVertex* const fromvp - = dynamic_cast(oedgep->fromp()); + = static_cast(oedgep->fromp()); new V3GraphEdge(m_graphp, fromvp, m_logicvp, 1); VL_DO_DANGLING(oedgep->unlinkDelete(), oedgep); } diff --git a/src/V3Order.cpp b/src/V3Order.cpp index 1d83983ea..9c20558e4 100644 --- a/src/V3Order.cpp +++ b/src/V3Order.cpp @@ -1027,8 +1027,8 @@ class OrderVerticesByDomainThenScope final { public: virtual bool operator()(const V3GraphVertex* lhsp, const V3GraphVertex* rhsp) const { - const MTaskMoveVertex* const l_vxp = dynamic_cast(lhsp); - const MTaskMoveVertex* const r_vxp = dynamic_cast(rhsp); + const MTaskMoveVertex* const l_vxp = static_cast(lhsp); + const MTaskMoveVertex* const r_vxp = static_cast(rhsp); uint64_t l_id = m_ids.findId(l_vxp->domainp()); uint64_t r_id = m_ids.findId(r_vxp->domainp()); if (l_id < r_id) return true; @@ -1047,8 +1047,8 @@ public: // Sort vertex's, which must be AbstractMTask's, into a deterministic // order by comparing their serial IDs. virtual bool operator()(const V3GraphVertex* lhsp, const V3GraphVertex* rhsp) const { - const AbstractMTask* const lmtaskp = dynamic_cast(lhsp); - const AbstractMTask* const rmtaskp = dynamic_cast(rhsp); + const AbstractMTask* const lmtaskp = static_cast(lhsp); + const AbstractMTask* const rmtaskp = static_cast(rhsp); return lmtaskp->id() < rmtaskp->id(); } }; @@ -1932,7 +1932,7 @@ void OrderProcess::processMTasks() { GraphStream emit_logic(&logicGraph); const V3GraphVertex* moveVxp; while ((moveVxp = emit_logic.nextp())) { - const MTaskMoveVertex* const movep = dynamic_cast(moveVxp); + const MTaskMoveVertex* const movep = static_cast(moveVxp); const unsigned mtaskId = movep->color(); UASSERT(mtaskId > 0, "Every MTaskMoveVertex should have an mtask assignment >0"); if (movep->logicp()) { @@ -1976,7 +1976,7 @@ void OrderProcess::processMTasks() { GraphStream emit_mtasks(&mtasks); const V3GraphVertex* mtaskVxp; while ((mtaskVxp = emit_mtasks.nextp())) { - const AbstractLogicMTask* const mtaskp = dynamic_cast(mtaskVxp); + const AbstractLogicMTask* const mtaskp = static_cast(mtaskVxp); // Create a body for this mtask AstMTaskBody* const bodyp = new AstMTaskBody(rootFlp); @@ -2018,7 +2018,7 @@ void OrderProcess::processMTasks() { for (V3GraphEdge* inp = mtaskp->inBeginp(); inp; inp = inp->inNextp()) { const V3GraphVertex* fromVxp = inp->fromp(); const AbstractLogicMTask* const fromp - = dynamic_cast(fromVxp); + = static_cast(fromVxp); const MTaskState& fromState = mtaskStates[fromp->id()]; new V3GraphEdge(depGraphp, fromState.m_execMTaskp, state.m_execMTaskp, 1); } diff --git a/src/V3VariableOrder.cpp b/src/V3VariableOrder.cpp index d62cfb50f..d3ea7aa3d 100644 --- a/src/V3VariableOrder.cpp +++ b/src/V3VariableOrder.cpp @@ -52,14 +52,14 @@ public: ~VarTspSorter() override = default; // METHODS virtual bool operator<(const TspStateBase& other) const override { - return operator<(dynamic_cast(other)); + return operator<(static_cast(other)); } bool operator<(const VarTspSorter& other) const { return m_serial < other.m_serial; } const MTaskIdSet& mtaskIds() const { return m_mtaskIds; } virtual int cost(const TspStateBase* otherp) const override { - return cost(dynamic_cast(otherp)); + return cost(static_cast(otherp)); } - virtual int cost(const VarTspSorter* otherp) const { + int cost(const VarTspSorter* otherp) const { int cost = diffs(m_mtaskIds, otherp->m_mtaskIds); cost += diffs(otherp->m_mtaskIds, m_mtaskIds); return cost;