Make the LoopRotate pass's maximum header size configurable both programmatically

and via the command line, mirroring similar functionality in LoopUnroll.  In
situations where clients used custom unrolling thresholds, their intent could
previously be foiled by LoopRotate having a hardcoded threshold.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@209617 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Owen Anderson 2014-05-26 08:58:51 +00:00
parent bcc96923e0
commit 866ed7f63f
2 changed files with 15 additions and 5 deletions

View File

@ -155,7 +155,7 @@ Pass *createLoopRerollPass();
// //
// LoopRotate - This pass is a simple loop rotating pass. // LoopRotate - This pass is a simple loop rotating pass.
// //
Pass *createLoopRotatePass(); Pass *createLoopRotatePass(int MaxHeaderSize = -1);
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// //

View File

@ -23,6 +23,7 @@
#include "llvm/IR/Dominators.h" #include "llvm/IR/Dominators.h"
#include "llvm/IR/Function.h" #include "llvm/IR/Function.h"
#include "llvm/IR/IntrinsicInst.h" #include "llvm/IR/IntrinsicInst.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h" #include "llvm/Support/Debug.h"
#include "llvm/Transforms/Utils/BasicBlockUtils.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h"
#include "llvm/Transforms/Utils/Local.h" #include "llvm/Transforms/Utils/Local.h"
@ -32,7 +33,9 @@ using namespace llvm;
#define DEBUG_TYPE "loop-rotate" #define DEBUG_TYPE "loop-rotate"
#define MAX_HEADER_SIZE 16 static cl::opt<unsigned>
DefaultRotationThreshold("rotation-max-header-size", cl::init(16), cl::Hidden,
cl::desc("The default maximum header size for automatic loop rotation"));
STATISTIC(NumRotated, "Number of loops rotated"); STATISTIC(NumRotated, "Number of loops rotated");
namespace { namespace {
@ -40,8 +43,12 @@ namespace {
class LoopRotate : public LoopPass { class LoopRotate : public LoopPass {
public: public:
static char ID; // Pass ID, replacement for typeid static char ID; // Pass ID, replacement for typeid
LoopRotate() : LoopPass(ID) { LoopRotate(int SpecifiedMaxHeaderSize = -1) : LoopPass(ID) {
initializeLoopRotatePass(*PassRegistry::getPassRegistry()); initializeLoopRotatePass(*PassRegistry::getPassRegistry());
if (SpecifiedMaxHeaderSize == -1)
MaxHeaderSize = DefaultRotationThreshold;
else
MaxHeaderSize = unsigned(SpecifiedMaxHeaderSize);
} }
// LCSSA form makes instruction renaming easier. // LCSSA form makes instruction renaming easier.
@ -62,6 +69,7 @@ namespace {
bool rotateLoop(Loop *L, bool SimplifiedLatch); bool rotateLoop(Loop *L, bool SimplifiedLatch);
private: private:
unsigned MaxHeaderSize;
LoopInfo *LI; LoopInfo *LI;
const TargetTransformInfo *TTI; const TargetTransformInfo *TTI;
}; };
@ -75,7 +83,9 @@ INITIALIZE_PASS_DEPENDENCY(LoopSimplify)
INITIALIZE_PASS_DEPENDENCY(LCSSA) INITIALIZE_PASS_DEPENDENCY(LCSSA)
INITIALIZE_PASS_END(LoopRotate, "loop-rotate", "Rotate Loops", false, false) INITIALIZE_PASS_END(LoopRotate, "loop-rotate", "Rotate Loops", false, false)
Pass *llvm::createLoopRotatePass() { return new LoopRotate(); } Pass *llvm::createLoopRotatePass(int MaxHeaderSize) {
return new LoopRotate(MaxHeaderSize);
}
/// Rotate Loop L as many times as possible. Return true if /// Rotate Loop L as many times as possible. Return true if
/// the loop is rotated at least once. /// the loop is rotated at least once.
@ -320,7 +330,7 @@ bool LoopRotate::rotateLoop(Loop *L, bool SimplifiedLatch) {
<< " instructions: "; L->dump()); << " instructions: "; L->dump());
return false; return false;
} }
if (Metrics.NumInsts > MAX_HEADER_SIZE) if (Metrics.NumInsts > MaxHeaderSize)
return false; return false;
} }