forked from OSchip/llvm-project
name change: isPow2DivCheap -> isPow2SDivCheap
isPow2DivCheap That name doesn't specify signed or unsigned. Lazy as I am, I eventually read the function and variable comments. It turns out that this is strictly about signed div. But I discovered that the comments are wrong: srl/add/sra is not the general sequence for signed integer division by power-of-2. We need one more 'sra': sra/srl/add/sra That's the sequence produced in DAGCombiner. The first 'sra' may be removed when dividing by exactly '2', but that's a special case. This patch corrects the comments, changes the name of the flag bit, and changes the name of the accessor methods. No functional change intended. Differential Revision: http://reviews.llvm.org/D5010 llvm-svn: 216237
This commit is contained in:
parent
6674b095b8
commit
2cdea4c41e
|
@ -223,8 +223,8 @@ public:
|
|||
return BypassSlowDivWidths;
|
||||
}
|
||||
|
||||
/// Return true if pow2 div is cheaper than a chain of srl/add/sra.
|
||||
bool isPow2DivCheap() const { return Pow2DivIsCheap; }
|
||||
/// Return true if pow2 sdiv is cheaper than a chain of sra/srl/add/sra.
|
||||
bool isPow2SDivCheap() const { return Pow2SDivIsCheap; }
|
||||
|
||||
/// Return true if Flow Control is an expensive operation that should be
|
||||
/// avoided.
|
||||
|
@ -1105,9 +1105,9 @@ protected:
|
|||
BypassSlowDivWidths[SlowBitWidth] = FastBitWidth;
|
||||
}
|
||||
|
||||
/// Tells the code generator that it shouldn't generate srl/add/sra for a
|
||||
/// signed divide by power of two, and let the target handle it.
|
||||
void setPow2DivIsCheap(bool isCheap = true) { Pow2DivIsCheap = isCheap; }
|
||||
/// Tells the code generator that it shouldn't generate sra/srl/add/sra for a
|
||||
/// signed divide by power of two; let the target handle it.
|
||||
void setPow2SDivIsCheap(bool isCheap = true) { Pow2SDivIsCheap = isCheap; }
|
||||
|
||||
/// Add the specified register class as an available regclass for the
|
||||
/// specified value type. This indicates the selector can handle values of
|
||||
|
@ -1526,9 +1526,9 @@ private:
|
|||
/// div/rem when the operands are positive and less than 256.
|
||||
DenseMap <unsigned int, unsigned int> BypassSlowDivWidths;
|
||||
|
||||
/// Tells the code generator that it shouldn't generate srl/add/sra for a
|
||||
/// signed divide by power of two, and let the target handle it.
|
||||
bool Pow2DivIsCheap;
|
||||
/// Tells the code generator that it shouldn't generate sra/srl/add/sra for a
|
||||
/// signed divide by power of two; let the target handle it.
|
||||
bool Pow2SDivIsCheap;
|
||||
|
||||
/// Tells the code generator that it shouldn't generate extra flow control
|
||||
/// instructions and should attempt to combine flow control instructions via
|
||||
|
|
|
@ -2082,7 +2082,7 @@ SDValue DAGCombiner::visitSDIV(SDNode *N) {
|
|||
(-N1C->getAPIntValue()).isPowerOf2())) {
|
||||
// If dividing by powers of two is cheap, then don't perform the following
|
||||
// fold.
|
||||
if (TLI.isPow2DivCheap())
|
||||
if (TLI.isPow2SDivCheap())
|
||||
return SDValue();
|
||||
|
||||
// Target-specific implementation of sdiv x, pow2.
|
||||
|
|
|
@ -701,7 +701,7 @@ TargetLoweringBase::TargetLoweringBase(const TargetMachine &tm,
|
|||
HasMultipleConditionRegisters = false;
|
||||
HasExtractBitsInsn = false;
|
||||
IntDivIsCheap = false;
|
||||
Pow2DivIsCheap = false;
|
||||
Pow2SDivIsCheap = false;
|
||||
JumpIsExpensive = false;
|
||||
PredictableSelectIsExpensive = false;
|
||||
MaskAndBranchFoldingIsLegal = false;
|
||||
|
|
|
@ -67,7 +67,7 @@ static TargetLoweringObjectFile *createTLOF(const Triple &TT) {
|
|||
PPCTargetLowering::PPCTargetLowering(PPCTargetMachine &TM)
|
||||
: TargetLowering(TM, createTLOF(Triple(TM.getTargetTriple()))),
|
||||
Subtarget(*TM.getSubtargetImpl()) {
|
||||
setPow2DivIsCheap();
|
||||
setPow2SDivIsCheap();
|
||||
|
||||
// Use _setjmp/_longjmp instead of setjmp/longjmp.
|
||||
setUseUnderscoreSetJmp(true);
|
||||
|
|
|
@ -386,7 +386,7 @@ AMDGPUTargetLowering::AMDGPUTargetLowering(TargetMachine &TM) :
|
|||
// There are no integer divide instructions, and these expand to a pretty
|
||||
// large sequence of instructions.
|
||||
setIntDivIsCheap(false);
|
||||
setPow2DivIsCheap(false);
|
||||
setPow2SDivIsCheap(false);
|
||||
|
||||
// TODO: Investigate this when 64-bit divides are implemented.
|
||||
addBypassSlowDiv(64, 32);
|
||||
|
|
Loading…
Reference in New Issue