From 5d67d8916e711daf4dd961d27f49ed408938be7c Mon Sep 17 00:00:00 2001 From: Sanjay Patel Date: Thu, 24 Aug 2017 14:43:33 +0000 Subject: [PATCH] [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 --- .../Transforms/Utils/BypassSlowDivision.h | 30 ++++++++++++++++ .../Transforms/Utils/BypassSlowDivision.cpp | 36 ++----------------- 2 files changed, 32 insertions(+), 34 deletions(-) diff --git a/llvm/include/llvm/Transforms/Utils/BypassSlowDivision.h b/llvm/include/llvm/Transforms/Utils/BypassSlowDivision.h index af0d60b2625f..663bef2594b0 100644 --- a/llvm/include/llvm/Transforms/Utils/BypassSlowDivision.h +++ b/llvm/include/llvm/Transforms/Utils/BypassSlowDivision.h @@ -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 { + 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(Val.Dividend) ^ + reinterpret_cast(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. /// diff --git a/llvm/lib/Transforms/Utils/BypassSlowDivision.cpp b/llvm/lib/Transforms/Utils/BypassSlowDivision.cpp index 83ec7f55d1af..d6c31f282e87 100644 --- a/llvm/lib/Transforms/Utils/BypassSlowDivision.cpp +++ b/llvm/lib/Transforms/Utils/BypassSlowDivision.cpp @@ -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 { - 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(Val.Dividend) ^ - reinterpret_cast(Val.Divisor)) ^ - (unsigned)Val.SignedOp; - } - }; - - typedef DenseMap DivCacheTy; + typedef DenseMap DivCacheTy; typedef DenseMap BypassWidthsTy; typedef SmallPtrSet 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()) {