[llvm] r219123 - DbgValueHistoryCalculator: Store modified registers in a BitVector instead of std::set.

David Blaikie dblaikie at gmail.com
Mon Oct 6 09:24:52 PDT 2014


On Mon, Oct 6, 2014 at 8:31 AM, Benjamin Kramer <benny.kra at googlemail.com>
wrote:

> Author: d0k
> Date: Mon Oct  6 10:31:04 2014
> New Revision: 219123
>
> URL: http://llvm.org/viewvc/llvm-project?rev=219123&view=rev
> Log:
> DbgValueHistoryCalculator: Store modified registers in a BitVector instead
> of std::set.
>
> And iterate over the smaller map instead of the larger set first.  Reduces
> the time spent in
> calculateDbgValueHistory by 30-40%.
>

Awesome - thanks a bunch.

Any particular tool/approach you took in finding this?


>
> Modified:
>     llvm/trunk/lib/CodeGen/AsmPrinter/DbgValueHistoryCalculator.cpp
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DbgValueHistoryCalculator.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DbgValueHistoryCalculator.cpp?rev=219123&r1=219122&r2=219123&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DbgValueHistoryCalculator.cpp
> (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DbgValueHistoryCalculator.cpp Mon
> Oct  6 10:31:04 2014
> @@ -8,6 +8,7 @@
>
>  //===----------------------------------------------------------------------===//
>
>  #include "DbgValueHistoryCalculator.h"
> +#include "llvm/ADT/BitVector.h"
>  #include "llvm/ADT/SmallVector.h"
>  #include "llvm/CodeGen/MachineBasicBlock.h"
>  #include "llvm/CodeGen/MachineFunction.h"
> @@ -16,12 +17,10 @@
>  #include "llvm/Target/TargetRegisterInfo.h"
>  #include <algorithm>
>  #include <map>
> -#include <set>
> +using namespace llvm;
>
>  #define DEBUG_TYPE "dwarfdebug"
>
> -namespace llvm {
> -
>  // \brief If @MI is a DBG_VALUE with debug value described by a
>  // defined register, returns the number of this register.
>  // In the other case, returns 0.
> @@ -97,6 +96,19 @@ static void addRegDescribedVar(RegDescri
>    VarSet.push_back(Var);
>  }
>
> +// \brief Terminate the location range for variables described by
> register at
> +// @I by inserting @ClobberingInstr to their history.
> +static void clobberRegisterUses(RegDescribedVarsMap &RegVars,
> +                                RegDescribedVarsMap::iterator I,
> +                                DbgValueHistoryMap &HistMap,
> +                                const MachineInstr &ClobberingInstr) {
> +  // Iterate over all variables described by this register and add this
> +  // instruction to their history, clobbering it.
> +  for (const auto &Var : I->second)
> +    HistMap.endInstrRange(Var, ClobberingInstr);
> +  RegVars.erase(I);
> +}
> +
>  // \brief Terminate the location range for variables described by register
>  // @RegNo by inserting @ClobberingInstr to their history.
>  static void clobberRegisterUses(RegDescribedVarsMap &RegVars, unsigned
> RegNo,
> @@ -105,11 +117,7 @@ static void clobberRegisterUses(RegDescr
>    const auto &I = RegVars.find(RegNo);
>    if (I == RegVars.end())
>      return;
> -  // Iterate over all variables described by this register and add this
> -  // instruction to their history, clobbering it.
> -  for (const auto &Var : I->second)
> -    HistMap.endInstrRange(Var, ClobberingInstr);
> -  RegVars.erase(I);
> +  clobberRegisterUses(RegVars, I, HistMap, ClobberingInstr);
>  }
>
>  // \brief Collect all registers clobbered by @MI and apply the functor
> @@ -142,11 +150,12 @@ static const MachineInstr *getFirstEpilo
>    // as the return instruction.
>    DebugLoc LastLoc = LastMI->getDebugLoc();
>    auto Res = LastMI;
> -  for (MachineBasicBlock::const_reverse_iterator I(std::next(LastMI)); I
> != MBB.rend();
> -       ++I) {
> +  for (MachineBasicBlock::const_reverse_iterator I(std::next(LastMI)),
> +       E = MBB.rend();
> +       I != E; ++I) {
>      if (I->getDebugLoc() != LastLoc)
>        return Res;
> -    Res = std::prev(I.base());
> +    Res = &*I;
>    }
>    // If all instructions have the same debug location, assume whole MBB is
>    // an epilogue.
> @@ -157,7 +166,7 @@ static const MachineInstr *getFirstEpilo
>  // contents is changed outside of the prologue and epilogue).
>  static void collectChangingRegs(const MachineFunction *MF,
>                                  const TargetRegisterInfo *TRI,
> -                                std::set<unsigned> &Regs) {
> +                                BitVector &Regs) {
>    for (const auto &MBB : *MF) {
>      auto FirstEpilogueInst = getFirstEpilogueInst(MBB);
>
> @@ -165,15 +174,15 @@ static void collectChangingRegs(const Ma
>        if (&MI == FirstEpilogueInst)
>          break;
>        if (!MI.getFlag(MachineInstr::FrameSetup))
> -        applyToClobberedRegisters(MI, TRI, [&](unsigned r) {
> Regs.insert(r); });
> +        applyToClobberedRegisters(MI, TRI, [&](unsigned r) { Regs.set(r);
> });
>      }
>    }
>  }
>
> -void calculateDbgValueHistory(const MachineFunction *MF,
> -                              const TargetRegisterInfo *TRI,
> -                              DbgValueHistoryMap &Result) {
> -  std::set<unsigned> ChangingRegs;
> +void llvm::calculateDbgValueHistory(const MachineFunction *MF,
> +                                    const TargetRegisterInfo *TRI,
> +                                    DbgValueHistoryMap &Result) {
> +  BitVector ChangingRegs(TRI->getNumRegs());
>    collectChangingRegs(MF, TRI, ChangingRegs);
>
>    RegDescribedVarsMap RegVars;
> @@ -183,7 +192,7 @@ void calculateDbgValueHistory(const Mach
>          // Not a DBG_VALUE instruction. It may clobber registers which
> describe
>          // some variables.
>          applyToClobberedRegisters(MI, TRI, [&](unsigned RegNo) {
> -          if (ChangingRegs.count(RegNo))
> +          if (ChangingRegs.test(RegNo))
>              clobberRegisterUses(RegVars, RegNo, Result, MI);
>          });
>          continue;
> @@ -207,11 +216,12 @@ void calculateDbgValueHistory(const Mach
>      // Make sure locations for register-described variables are valid only
>      // until the end of the basic block (unless it's the last basic
> block, in
>      // which case let their liveness run off to the end of the function).
> -    if (!MBB.empty() &&  &MBB != &MF->back()) {
> -      for (unsigned RegNo : ChangingRegs)
> -        clobberRegisterUses(RegVars, RegNo, Result, MBB.back());
> +    if (!MBB.empty() && &MBB != &MF->back()) {
> +      for (auto I = RegVars.begin(), E = RegVars.end(); I != E;) {
> +        auto CurElem = I++; // CurElem can be erased below.
> +        if (ChangingRegs.test(CurElem->first))
> +          clobberRegisterUses(RegVars, CurElem, Result, MBB.back());
> +      }
>      }
>    }
>  }
> -
> -}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20141006/bebea50a/attachment.html>


More information about the llvm-commits mailing list