forked from OSchip/llvm-project
[SROA] Add a debugging tool which shuffles the slices sequence prior to
sorting it. This helps uncover latent reliance on the original ordering which aren't guaranteed to be preserved by std::sort (but often are), and which are based on the use-def chain orderings which also aren't (technically) guaranteed. Only available in C++11 debug builds, and behind a flag to prevent noise at the moment, but this is generally useful so figured I'd put it in the tree rather than keeping it out-of-tree. llvm-svn: 202106
This commit is contained in:
parent
0b9682efa4
commit
83cee7722d
|
@ -51,10 +51,17 @@
|
|||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/MathExtras.h"
|
||||
#include "llvm/Support/TimeValue.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/Transforms/Utils/Local.h"
|
||||
#include "llvm/Transforms/Utils/PromoteMemToReg.h"
|
||||
#include "llvm/Transforms/Utils/SSAUpdater.h"
|
||||
|
||||
#if __cplusplus >= 201103L && !defined(NDEBUG)
|
||||
// We only use this for a debug check in C++11
|
||||
#include <random>
|
||||
#endif
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
STATISTIC(NumAllocasAnalyzed, "Number of allocas analyzed for replacement");
|
||||
|
@ -73,6 +80,11 @@ STATISTIC(NumVectorized, "Number of vectorized aggregates");
|
|||
static cl::opt<bool>
|
||||
ForceSSAUpdater("force-ssa-updater", cl::init(false), cl::Hidden);
|
||||
|
||||
/// Hidden option to enable randomly shuffling the slices to help uncover
|
||||
/// instability in their order.
|
||||
static cl::opt<bool> SROARandomShuffleSlices("sroa-random-shuffle-slices",
|
||||
cl::init(false), cl::Hidden);
|
||||
|
||||
namespace {
|
||||
/// \brief A custom IRBuilder inserter which prefixes all names if they are
|
||||
/// preserved.
|
||||
|
@ -690,6 +702,13 @@ AllocaSlices::AllocaSlices(const DataLayout &DL, AllocaInst &AI)
|
|||
std::mem_fun_ref(&Slice::isDead)),
|
||||
Slices.end());
|
||||
|
||||
#if __cplusplus >= 201103L && !defined(NDEBUG)
|
||||
if (SROARandomShuffleSlices) {
|
||||
std::mt19937 MT(static_cast<unsigned>(sys::TimeValue::now().msec()));
|
||||
std::shuffle(Slices.begin(), Slices.end(), MT);
|
||||
}
|
||||
#endif
|
||||
|
||||
// Sort the uses. This arranges for the offsets to be in ascending order,
|
||||
// and the sizes to be in descending order.
|
||||
std::sort(Slices.begin(), Slices.end());
|
||||
|
|
Loading…
Reference in New Issue