forked from OSchip/llvm-project
Added "Profile" method to APFloat for use with FoldingSet.
Added member template "Add" to FoldingSetNodeID that allows "adding" arbitrary objects to a profile via dispatch to FoldingSetTrait<T>::Profile(). Removed FoldingSetNodeID::AddAPFloat and FoldingSetNodeID::APInt, as their functionality is now replaced using the above mentioned member template. llvm-svn: 46957
This commit is contained in:
parent
e6f630e77e
commit
6f30a0798f
|
@ -181,6 +181,10 @@ namespace llvm {
|
|||
APFloat(const APFloat &);
|
||||
~APFloat();
|
||||
|
||||
/// Profile - Used to insert APFloat objects, or objects that contain
|
||||
/// APFloat objects, into FoldingSets.
|
||||
void Profile(FoldingSetNodeID& NID) const;
|
||||
|
||||
/// @brief Used by the Bitcode serializer to emit APInts to Bitcode.
|
||||
void Emit(Serializer& S) const;
|
||||
|
||||
|
|
|
@ -178,6 +178,19 @@ protected:
|
|||
virtual void GetNodeProfile(FoldingSetNodeID &ID, Node *N) const = 0;
|
||||
};
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// FoldingSetTrait - This trait class is used to define behavior of how
|
||||
/// to "profile" (in the FoldingSet parlance) an object of a given type.
|
||||
/// The default behavior is to invoke a 'Profile' method on an object, but
|
||||
/// through template specialization the behavior can be tailored for specific
|
||||
/// types. Combined with the FoldingSetNodeWrapper classs, one can add objects
|
||||
/// to FoldingSets that were not originally designed to have that behavior.
|
||||
///
|
||||
template<typename T> struct FoldingSetTrait {
|
||||
static inline void Profile(const T& X, FoldingSetNodeID& ID) { X.Profile(ID);}
|
||||
static inline void Profile(T& X, FoldingSetNodeID& ID) { X.Profile(ID); }
|
||||
};
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
/// FoldingSetNodeID - This class is used to gather all the unique data bits of
|
||||
/// a node. When all the bits are gathered this class is used to produce a
|
||||
|
@ -206,10 +219,11 @@ public:
|
|||
void AddInteger(uint64_t I);
|
||||
void AddFloat(float F);
|
||||
void AddDouble(double D);
|
||||
void AddAPFloat(const APFloat& apf);
|
||||
void AddAPInt(const APInt& api);
|
||||
void AddString(const std::string &String);
|
||||
|
||||
template <typename T>
|
||||
inline void Add(const T& x) { FoldingSetTrait<T>::Profile(x, *this); }
|
||||
|
||||
/// clear - Clear the accumulated profile, allowing this FoldingSetNodeID
|
||||
/// object to be used to compute a new profile.
|
||||
inline void clear() { Bits.clear(); }
|
||||
|
@ -227,19 +241,6 @@ public:
|
|||
typedef FoldingSetImpl::Node FoldingSetNode;
|
||||
template<class T> class FoldingSetIterator;
|
||||
template<class T> class FoldingSetBucketIterator;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// FoldingSetTrait - This trait class is used to define behavior of how
|
||||
/// to "profile" (in the FoldingSet parlance) an object of a given type.
|
||||
/// The default behavior is to invoke a 'Profile' method on an object, but
|
||||
/// through template specialization the behavior can be tailored for specific
|
||||
/// types. Combined with the FoldingSetNodeWrapper classs, one can add objects
|
||||
/// to FoldingSets that were not originally designed to have that behavior.
|
||||
///
|
||||
template<typename T> struct FoldingSetTrait {
|
||||
static inline void Profile(const T& X, FoldingSetNodeID& ID) { X.Profile(ID);}
|
||||
static inline void Profile(T& X, FoldingSetNodeID& ID) { X.Profile(ID); }
|
||||
};
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// FoldingSet - This template class is used to instantiate a specialized
|
||||
|
|
|
@ -35,6 +35,10 @@ private:
|
|||
template <typename T>
|
||||
struct AlignOf {
|
||||
enum { Alignment = sizeof(AlignmentCalcImpl<T>) - sizeof(T) };
|
||||
enum { Alignment_GreaterEqual_2Bytes = Alignment >= 2 ? 1 : 0 };
|
||||
enum { Alignment_GreaterEqual_4Bytes = Alignment >= 4 ? 1 : 0 };
|
||||
enum { Alignment_GreaterEqual_8Bytes = Alignment >= 8 ? 1 : 0 };
|
||||
enum { Alignment_GreaterEqual_16Bytes = Alignment >= 16 ? 1 : 0 };
|
||||
};
|
||||
|
||||
/// alignof - A templated function that returns the mininum alignment of
|
||||
|
|
|
@ -344,7 +344,7 @@ static void AddNodeIDNode(FoldingSetNodeID &ID, SDNode *N) {
|
|||
break;
|
||||
case ISD::TargetConstantFP:
|
||||
case ISD::ConstantFP: {
|
||||
ID.AddAPFloat(cast<ConstantFPSDNode>(N)->getValueAPF());
|
||||
ID.Add(cast<ConstantFPSDNode>(N)->getValueAPF());
|
||||
break;
|
||||
}
|
||||
case ISD::TargetGlobalAddress:
|
||||
|
@ -724,7 +724,7 @@ SDOperand SelectionDAG::getConstant(const APInt &Val, MVT::ValueType VT, bool is
|
|||
unsigned Opc = isT ? ISD::TargetConstant : ISD::Constant;
|
||||
FoldingSetNodeID ID;
|
||||
AddNodeIDNode(ID, Opc, getVTList(EltVT), 0, 0);
|
||||
ID.AddAPInt(Val);
|
||||
ID.Add(Val);
|
||||
void *IP = 0;
|
||||
SDNode *N = NULL;
|
||||
if ((N = CSEMap.FindNodeOrInsertPos(ID, IP)))
|
||||
|
@ -763,7 +763,7 @@ SDOperand SelectionDAG::getConstantFP(const APFloat& V, MVT::ValueType VT,
|
|||
unsigned Opc = isTarget ? ISD::TargetConstantFP : ISD::ConstantFP;
|
||||
FoldingSetNodeID ID;
|
||||
AddNodeIDNode(ID, Opc, getVTList(EltVT), 0, 0);
|
||||
ID.AddAPFloat(V);
|
||||
ID.Add(V);
|
||||
void *IP = 0;
|
||||
SDNode *N = NULL;
|
||||
if ((N = CSEMap.FindNodeOrInsertPos(ID, IP)))
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/ADT/APFloat.h"
|
||||
#include "llvm/ADT/FoldingSet.h"
|
||||
#include <cassert>
|
||||
#include <cstring>
|
||||
#include "llvm/Support/MathExtras.h"
|
||||
|
@ -691,6 +692,11 @@ APFloat::~APFloat()
|
|||
freeSignificand();
|
||||
}
|
||||
|
||||
// Profile - This method 'profiles' an APFloat for use with FoldingSet.
|
||||
void APFloat::Profile(FoldingSetNodeID& ID) const {
|
||||
ID.Add(convertToAPInt());
|
||||
}
|
||||
|
||||
unsigned int
|
||||
APFloat::partCount() const
|
||||
{
|
||||
|
|
|
@ -15,8 +15,6 @@
|
|||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/ADT/FoldingSet.h"
|
||||
#include "llvm/ADT/APFloat.h"
|
||||
#include "llvm/ADT/APInt.h"
|
||||
#include "llvm/Support/MathExtras.h"
|
||||
#include <cassert>
|
||||
using namespace llvm;
|
||||
|
@ -58,15 +56,6 @@ void FoldingSetNodeID::AddFloat(float F) {
|
|||
void FoldingSetNodeID::AddDouble(double D) {
|
||||
AddInteger(DoubleToBits(D));
|
||||
}
|
||||
void FoldingSetNodeID::AddAPFloat(const APFloat& apf) {
|
||||
APInt api = apf.convertToAPInt();
|
||||
AddAPInt(api);
|
||||
}
|
||||
void FoldingSetNodeID::AddAPInt(const APInt& api) {
|
||||
const uint64_t *p = api.getRawData();
|
||||
for (unsigned i=0; i<api.getNumWords(); i++)
|
||||
AddInteger(*p++);
|
||||
}
|
||||
void FoldingSetNodeID::AddString(const std::string &String) {
|
||||
unsigned Size = String.size();
|
||||
Bits.push_back(Size);
|
||||
|
|
Loading…
Reference in New Issue