[llvm-dev] RFC: Use closures to delay construction of optimization remarks

Hal Finkel via llvm-dev llvm-dev at lists.llvm.org
Sat Sep 16 17:51:00 PDT 2017


On 09/16/2017 06:49 PM, Sean Silva via llvm-dev wrote:
> 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)

This also seems like a good option.

  -Hal

>
> On Sep 16, 2017 4:39 PM, "Sean Silva" <chisophugis at gmail.com 
> <mailto: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 <mailto: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/D37921 <https://reviews.llvm.org/D37921>.
>         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
>         <https://reviews.llvm.org/D33514>
>
>
>         _______________________________________________
>         LLVM Developers mailing list
>         llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
>         http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>         <http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev>
>
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev

-- 
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170916/d6c80da7/attachment.html>


More information about the llvm-dev mailing list