[llvm-dev] [RFC] A new intrinsic, `llvm.blackbox`, to explicitly prevent constprop, die, etc optimizations
Philip Reames via llvm-dev
llvm-dev at lists.llvm.org
Tue Nov 3 15:09:41 PST 2015
The common use case I've seen for a black box like construct is when
writing microbenchmarks. In particular, you're generally looking for a
way to "sink" the result of a computation without having that sink
outweigh the cost of the thing you're trying to measure.
Common alternate approaches are to use a volatile store (so that it
can't be eliminated or sunk out of loops) or a call to an external
function with a cheap calling convention.
As an example:
int a = 5; // initialization is not visible to compiler
int b = 7;
void add_two_globals()
sink(a+b)
}
If what I'm look into is the code generation around addition, this is a
very useful way of testing the entire compiler - frontend, middle end,
and backend.
I'll note that we use such a framework extensively.
What I'm not clear on is why this needs to be an intrinsic. Why does a
call to an external function or a volatile store not suffice?
Philip
On 11/02/2015 07:16 PM, Daniel Berlin via llvm-dev wrote:
> I'm very unclear and why you think a generic black box intrinsic will
> have any different performance impact ;-)
>
>
> I'm also unclear on what the goal with this intrinsic is.
> I understand the symptoms you are trying to solve - what exactly is
> the disease.
>
> IE you say "
>
> I'd like to propose a new intrinsic for use in preventing
> optimizations from deleting IR due to constant propagation, dead code
> elimination, etc."
>
> But why are you trying to achieve this goal?
> Benchmarks that can be const prop'd/etc away are often meaningless.
> Past that, if you want to ensure a particular optimization does a
> particular thing on a benchmark, ISTM it would be better to generate
> the IR, run opt (or build your own pass-by-pass harness), and then run
> "the passes you want on it" instead of "trying to stop certain passes
> from doing things to it".
>
>
> On Mon, Nov 2, 2015 at 5:23 PM, Richard Diamond via llvm-dev
> <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
>
>
>
> On Mon, Nov 2, 2015 at 7:19 PM, Sanjoy Das
> <sanjoy at playingwithpointers.com
> <mailto:sanjoy at playingwithpointers.com>> wrote:
>
> Why does this need to be an intrinsic (as opposed to generic
> "unknown function" to llvm)?
>
> Secondly, have you looked into a volatile store / load to an
> alloca? That should work with PNaCl and WebAssembly.
>
> E.g.
>
> define i32 @blackbox(i32 %arg) {
> entry:
> %p = alloca i32
> store volatile i32 10, i32* %p ;; or store %arg
> %v = load volatile i32, i32* %p
> ret i32 %v
> }
>
>
> That volatility would have a negative performance impact.
>
> Richard Diamond
>
> _______________________________________________
> 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
>
>
>
>
> _______________________________________________
> 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/20151103/cb9903c1/attachment.html>
More information about the llvm-dev
mailing list