forked from OSchip/llvm-project
[BypassSlowDivision] move map helper code to header; NFC
We can reuse this code with other div/rem transforms as shown in: https://reviews.llvm.org/D31037 https://bugs.llvm.org/show_bug.cgi?id=31028 llvm-svn: 311661
This commit is contained in:
parent
38aa163611
commit
5d67d8916e
|
@ -23,6 +23,36 @@
|
|||
|
||||
namespace llvm {
|
||||
|
||||
struct DivRemMapKey {
|
||||
bool SignedOp;
|
||||
Value *Dividend;
|
||||
Value *Divisor;
|
||||
|
||||
DivRemMapKey(bool InSignedOp, Value *InDividend, Value *InDivisor)
|
||||
: SignedOp(InSignedOp), Dividend(InDividend), Divisor(InDivisor) {}
|
||||
};
|
||||
|
||||
template <> struct DenseMapInfo<DivRemMapKey> {
|
||||
static bool isEqual(const DivRemMapKey &Val1, const DivRemMapKey &Val2) {
|
||||
return Val1.SignedOp == Val2.SignedOp && Val1.Dividend == Val2.Dividend &&
|
||||
Val1.Divisor == Val2.Divisor;
|
||||
}
|
||||
|
||||
static DivRemMapKey getEmptyKey() {
|
||||
return DivRemMapKey(false, nullptr, nullptr);
|
||||
}
|
||||
|
||||
static DivRemMapKey getTombstoneKey() {
|
||||
return DivRemMapKey(true, nullptr, nullptr);
|
||||
}
|
||||
|
||||
static unsigned getHashValue(const DivRemMapKey &Val) {
|
||||
return (unsigned)(reinterpret_cast<uintptr_t>(Val.Dividend) ^
|
||||
reinterpret_cast<uintptr_t>(Val.Divisor)) ^
|
||||
(unsigned)Val.SignedOp;
|
||||
}
|
||||
};
|
||||
|
||||
/// This optimization identifies DIV instructions in a BB that can be
|
||||
/// profitably bypassed and carried out with a shorter, faster divide.
|
||||
///
|
||||
|
|
|
@ -30,15 +30,6 @@ using namespace llvm;
|
|||
#define DEBUG_TYPE "bypass-slow-division"
|
||||
|
||||
namespace {
|
||||
struct DivOpInfo {
|
||||
bool SignedOp;
|
||||
Value *Dividend;
|
||||
Value *Divisor;
|
||||
|
||||
DivOpInfo(bool InSignedOp, Value *InDividend, Value *InDivisor)
|
||||
: SignedOp(InSignedOp), Dividend(InDividend), Divisor(InDivisor) {}
|
||||
};
|
||||
|
||||
struct QuotRemPair {
|
||||
Value *Quotient;
|
||||
Value *Remainder;
|
||||
|
@ -58,30 +49,7 @@ namespace {
|
|||
}
|
||||
|
||||
namespace llvm {
|
||||
template<>
|
||||
struct DenseMapInfo<DivOpInfo> {
|
||||
static bool isEqual(const DivOpInfo &Val1, const DivOpInfo &Val2) {
|
||||
return Val1.SignedOp == Val2.SignedOp &&
|
||||
Val1.Dividend == Val2.Dividend &&
|
||||
Val1.Divisor == Val2.Divisor;
|
||||
}
|
||||
|
||||
static DivOpInfo getEmptyKey() {
|
||||
return DivOpInfo(false, nullptr, nullptr);
|
||||
}
|
||||
|
||||
static DivOpInfo getTombstoneKey() {
|
||||
return DivOpInfo(true, nullptr, nullptr);
|
||||
}
|
||||
|
||||
static unsigned getHashValue(const DivOpInfo &Val) {
|
||||
return (unsigned)(reinterpret_cast<uintptr_t>(Val.Dividend) ^
|
||||
reinterpret_cast<uintptr_t>(Val.Divisor)) ^
|
||||
(unsigned)Val.SignedOp;
|
||||
}
|
||||
};
|
||||
|
||||
typedef DenseMap<DivOpInfo, QuotRemPair> DivCacheTy;
|
||||
typedef DenseMap<DivRemMapKey, QuotRemPair> DivCacheTy;
|
||||
typedef DenseMap<unsigned, unsigned> BypassWidthsTy;
|
||||
typedef SmallPtrSet<Instruction *, 4> VisitedSetTy;
|
||||
}
|
||||
|
@ -175,7 +143,7 @@ Value *FastDivInsertionTask::getReplacement(DivCacheTy &Cache) {
|
|||
// Then, look for a value in Cache.
|
||||
Value *Dividend = SlowDivOrRem->getOperand(0);
|
||||
Value *Divisor = SlowDivOrRem->getOperand(1);
|
||||
DivOpInfo Key(isSignedOp(), Dividend, Divisor);
|
||||
DivRemMapKey Key(isSignedOp(), Dividend, Divisor);
|
||||
auto CacheI = Cache.find(Key);
|
||||
|
||||
if (CacheI == Cache.end()) {
|
||||
|
|
Loading…
Reference in New Issue