[llvm-dev] RFC: Use closures to delay construction of optimization remarks
Sean Silva via llvm-dev
llvm-dev at lists.llvm.org
Sat Sep 16 16:49:36 PDT 2017
Actually maybe something like:
if (auto &E = ORE.emitMissed(DEBUG_TYPE)) {
E.emit(...) << ...;
}
Credit to Chandler for that (if I'm remembering it right. This is vaguely
recollected from a LLVM social conversation a long time ago about reducing
overhead of clang diagnostics that are not enabled, which sounds like the
same problem)
On Sep 16, 2017 4:39 PM, "Sean Silva" <chisophugis at gmail.com> wrote:
> Another alternative could be:
>
> ORE.emitMissed(DEBUG_TYPE, ...) << ...
>
> Then the first line of emitMissed does a check if it is enabled and if not
> then returns a dummy stream that does nothing for operator<< (and
> short-circuits all the stream operations)
>
> On Sep 15, 2017 2:21 PM, "Adam Nemet via llvm-dev" <
> llvm-dev at lists.llvm.org> wrote:
>
> For better readability we typically create remarks and call
> OptimizationRemarkEmitter::emit unconditionally. E.g.:
>
> Transforms/IPO/Inliner.cpp: ORE.emit(OptimizationRemarkMissed(DEBUG_TYPE,
> "TooCostly", Call)
> Transforms/IPO/Inliner.cpp- << NV("Callee", Callee) << " not
> inlined into "
> Transforms/IPO/Inliner.cpp- << NV("Caller", Caller) << "
> because too costly to inline (cost="
> Transforms/IPO/Inliner.cpp- << NV("Cost", IC.getCost())
> Transforms/IPO/Inliner.cpp- << ", threshold=" <<
> NV("Threshold", IC.getThreshold()) << ")");
>
> Then inside ORE we return right away if the remarks for the given pass is
> not enabled.
>
> This is nice and concise however there is still some overhead involved in
> this if remarks are not enabled:
>
> 1. Constructing the remark object
> 2. Computing and inserting the strings, named-value arguments
> 3. Performing the comparison between the pass name and the passes enabled
> by the user
> 4. Virtual destructor
>
> Now that Vivek added support for asking LLVMContext for what remarks are
> enabled by the user [1] we can improve this. The idea is to allow
> ORE::emit to take a closure. This delays all this work until we know
> remarks are enabled. E.g. the above code with closure:
>
> ORE.emit(*[&]() {*
> *return* OptimizationRemarkMissed(DEBUG_TYPE, "TooCostly", Call)
> << NV("Callee", Callee) << " not inlined into "
> << NV("Caller", Caller) << " because too costly to inline
> (cost="
> << NV("Cost", IC.getCost())
> << ", threshold=" << NV("Threshold", IC.getThreshold()) << ")"
> *;*
> * }*);
>
>
> I have a proof-of-concept implementation at https://reviews.llvm.org/D3
> 7921.
>
> The main change is that since in the lambda the remark is now returned by
> value, we need to preserve its type in the insertion operator. This
> requires making the insertion operator generic. I am also curious if
> people see C++ portability problems with the code.
>
> Feedback welcome.
>
> Adam
>
> [1] https://reviews.llvm.org/D33514
>
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170916/1c0006f9/attachment.html>
More information about the llvm-dev
mailing list