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