• Nathan Bronson's avatar
    improvements to folly::doNotOptimizeAway · 81d9192f
    Nathan Bronson authored
    Summary:
    A common failure mode for folly::doNotOptimizeAway is to pass it a
    pointer to a complex object that the caller wants to ensure is fully
    calculated, which doesn't actually ensure that.  Also, the GCC and
    MSVC implementations used inline assembly with an in-out parameter,
    which causes a store.  A survey of many usages of doNotOptimizeAway
    found only 1 that relies on this make-unpredictable behavior.
    
    This diff makes doNotOptimizeAway(&x) equivalent to doNotOptimizeAway(x)
    for GCC and clang, and makes it a read-only sink.  For the rare
    case that the benchmark wants to disable subexpression elimination,
    constant propagation, or power reduction, there is a new function
    makeUnpredictable.  It also merges the clang and GCC implementations,
    removing a potential bias in our microbenchmarks.
    
    Reviewed By: davidtgoldblatt
    
    Differential Revision: D4074670
    
    fbshipit-source-id: 43f02e7fe149147bb172babe77787dea06e098fa
    81d9192f
Benchmark.h 18.6 KB