Skip to content

Commit

Permalink
[vectorizer] Add some flags which are useful for conducting experiments
Browse files Browse the repository at this point in the history
with the unrolling behavior in the loop vectorizer. No functionality
changed at this point.

These are a bit hack-y, but talking with Hal, there doesn't seem to be
a cleaner way to easily experiment with different thresholds here and he
was also interested in them so I wanted to commit them. Suggestions for
improvement are very welcome here.

llvm-svn: 200212
  • Loading branch information
chandlerc committed Jan 27, 2014
1 parent 328998b commit 7f90b45
Showing 1 changed file with 38 additions and 2 deletions.
40 changes: 38 additions & 2 deletions llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -139,11 +139,30 @@ static const unsigned RuntimeMemoryCheckThreshold = 8;
/// Maximum simd width.
static const unsigned MaxVectorWidth = 64;

static cl::opt<unsigned> ForceTargetNumScalarRegs(
"force-target-num-scalar-regs", cl::init(0), cl::Hidden,
cl::desc("A flag that overrides the target's number of scalar registers."));

static cl::opt<unsigned> ForceTargetNumVectorRegs(
"force-target-num-vector-regs", cl::init(0), cl::Hidden,
cl::desc("A flag that overrides the target's number of vector registers."));

/// Maximum vectorization unroll count.
static const unsigned MaxUnrollFactor = 16;

/// The cost of a loop that is considered 'small' by the unroller.
static const unsigned SmallLoopCost = 20;
static cl::opt<unsigned> ForceTargetMaxScalarUnrollFactor(
"force-target-max-scalar-unroll", cl::init(0), cl::Hidden,
cl::desc("A flag that overrides the target's max unroll factor for scalar "
"loops."));

static cl::opt<unsigned> ForceTargetMaxVectorUnrollFactor(
"force-target-max-vector-unroll", cl::init(0), cl::Hidden,
cl::desc("A flag that overrides the target's max unroll factor for "
"vectorized loops."));

static cl::opt<unsigned> SmallLoopCost(
"small-loop-cost", cl::init(20), cl::Hidden,
cl::desc("The cost of a loop that is considered 'small' by the unroller."));

namespace {

Expand Down Expand Up @@ -4966,6 +4985,14 @@ LoopVectorizationCostModel::selectUnrollFactor(bool OptForSize,
DEBUG(dbgs() << "LV: The target has " << TargetNumRegisters <<
" registers\n");

if (VF == 1) {
if (ForceTargetNumScalarRegs.getNumOccurrences() > 0)
TargetNumRegisters = ForceTargetNumScalarRegs;
} else {
if (ForceTargetNumVectorRegs.getNumOccurrences() > 0)
TargetNumRegisters = ForceTargetNumVectorRegs;
}

LoopVectorizationCostModel::RegisterUsage R = calculateRegisterUsage();
// We divide by these constants so assume that we have at least one
// instruction that uses at least one register.
Expand All @@ -4983,6 +5010,15 @@ LoopVectorizationCostModel::selectUnrollFactor(bool OptForSize,
// Clamp the unroll factor ranges to reasonable factors.
unsigned MaxUnrollSize = TTI.getMaximumUnrollFactor();

// Check if the user has overridden the unroll max.
if (VF == 1) {
if (ForceTargetMaxScalarUnrollFactor.getNumOccurrences() > 0)
MaxUnrollSize = ForceTargetMaxScalarUnrollFactor;
} else {
if (ForceTargetMaxVectorUnrollFactor.getNumOccurrences() > 0)
MaxUnrollSize = ForceTargetMaxVectorUnrollFactor;
}

// If we did not calculate the cost for VF (because the user selected the VF)
// then we calculate the cost of VF here.
if (LoopCost == 0)
Expand Down

0 comments on commit 7f90b45

Please sign in to comment.