[PATCH] D16832: Minor performance tweaks to llvm-tblgen (and a few that might be a good idea)
David Blaikie via llvm-commits
llvm-commits at lists.llvm.org
Tue Feb 2 17:50:51 PST 2016
On Tue, Feb 2, 2016 at 5:35 PM, Alexander Riccio via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> ariccio created this revision.
> ariccio added reviewers: rnk, qcolombet, craig.topper.
> ariccio added a subscriber: llvm-commits.
>
> This patch adds a reserve call to an expensive function
> (`llvm::LoadIntrinsics`), and may fix a few other low hanging performance
> fruit (I've put them in comments for now, so we can discuss).
>
> **Motivation:**
>
> As I'm sure other developers do, when I build LLVM, I build the entire
> project with the same config (`Debug`, `MinSizeRel`, `Release`, or
> `RelWithDebInfo`). However, the `Debug` config also builds llvm-tblgen in
> `Debug` mode. Later build steps that run llvm-tblgen then can actually be
> the slowest steps in the entire build. Nobody likes slow builds.
>
FWIW, there's a CMake config flag to address this: LLVM_OPTIMIZED_TABLEGEN
("Force TableGen to be built with optimization")
>
>
>
> http://reviews.llvm.org/D16832
>
> Files:
> C:/LLVM/llvm/include/llvm/TableGen/Record.h
> C:/LLVM/llvm/utils/TableGen/CodeGenInstruction.cpp
> C:/LLVM/llvm/utils/TableGen/CodeGenTarget.cpp
>
> Index: C:/LLVM/llvm/utils/TableGen/CodeGenInstruction.cpp
> ===================================================================
> --- C:/LLVM/llvm/utils/TableGen/CodeGenInstruction.cpp
> +++ C:/LLVM/llvm/utils/TableGen/CodeGenInstruction.cpp
> @@ -49,6 +49,11 @@
>
> unsigned MIOperandNo = 0;
> std::set<std::string> OperandNames;
> +
> + // TODO: can we reserve space for e elements in OperandList?
> + // Profiling a debug build with ETW revealed that the emplace_back
> + // at the very bottom of this loop can take up to 227ms, largely
> + // spent in reallocation.
> for (unsigned i = 0, e = InDI->getNumArgs()+OutDI->getNumArgs(); i !=
> e; ++i){
> Init *ArgInit;
> std::string ArgName;
> Index: C:/LLVM/llvm/include/llvm/TableGen/Record.h
> ===================================================================
> --- C:/LLVM/llvm/include/llvm/TableGen/Record.h
> +++ C:/LLVM/llvm/include/llvm/TableGen/Record.h
> @@ -1307,9 +1307,12 @@
> }
>
> bool isSubClassOf(StringRef Name) const {
> - for (const auto &SCPair : SuperClasses)
> + for (const auto &SCPair : SuperClasses) {
> + // TODO: getNameInitAsString copy constructs a new std::string,
> + // yet we're only using it in this comparison. Is there a better
> way?
> if (SCPair.first->getNameInitAsString() == Name)
> return true;
> + }
> return false;
> }
>
> Index: C:/LLVM/llvm/utils/TableGen/CodeGenTarget.cpp
> ===================================================================
> --- C:/LLVM/llvm/utils/TableGen/CodeGenTarget.cpp
> +++ C:/LLVM/llvm/utils/TableGen/CodeGenTarget.cpp
> @@ -441,12 +441,24 @@
> std::vector<Record*> I = RC.getAllDerivedDefinitions("Intrinsic");
>
> std::vector<CodeGenIntrinsic> Result;
> +
> + // Allocate enough memory to hold enough for worst case scenario
> + // in the following loop. Profiling a debug build with ETW
> + // revealed that push_back in the loop could take up to 280ms,
> + // largely spent in reallocation.
> + Result.reserve(I.size());
>
> for (unsigned i = 0, e = I.size(); i != e; ++i) {
> bool isTarget = I[i]->getValueAsBit("isTarget");
> if (isTarget == TargetOnly)
> Result.push_back(CodeGenIntrinsic(I[i]));
> }
> +
> + // TODO: does this lambda need to accept parameters by value?
> + // Profiling a debug build with ETW revealed that each call of
> + // std::_Unguarded_partition (an internal function, called by
> std::sort),
> + // can spend hundreds of milliseconds inside this lambda calling
> + // ~CodeGenIntrinsic(), which is quite wasteful.
> std::sort(Result.begin(), Result.end(),
> [](CodeGenIntrinsic LHS, CodeGenIntrinsic RHS) {
> return LHS.Name < RHS.Name;
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160202/6b5d4304/attachment.html>
More information about the llvm-commits
mailing list