mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-10 22:46:25 +00:00
[vectorizer] Add some flags which are useful for conducting experiments
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200212 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
3fa842d791
commit
9f22a8788f
@ -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 {
|
||||
|
||||
@ -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.
|
||||
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user