Index: src/IceOperand.h |
diff --git a/src/IceOperand.h b/src/IceOperand.h |
index 4ae217c5f3b36676469e1dd635920ecd0d1e0704..ae6668bb3af0a25cddf75cb04af46de6ba9236e0 100644 |
--- a/src/IceOperand.h |
+++ b/src/IceOperand.h |
@@ -117,9 +117,21 @@ public: |
return Kind >= kConst_Base && Kind <= kConst_Num; |
} |
+ // Judge if this given immediate should be randomized or pooled |
+ // By default should return false, only constant integers should |
+ // truly go through this method. |
+ virtual bool shouldBeRandomizedOrPooled(const GlobalContext *Ctx) { |
+ (void)Ctx; |
+ return false; |
+ } |
+ |
+ void setShouldBePooled(bool R) { shouldBePooled = R; } |
+ |
+ bool getShouldBePooled() const { return shouldBePooled; } |
+ |
protected: |
Constant(OperandKind Kind, Type Ty, uint32_t PoolEntryID) |
- : Operand(Kind, Ty), PoolEntryID(PoolEntryID) { |
+ : Operand(Kind, Ty), PoolEntryID(PoolEntryID), shouldBePooled(false) { |
Vars = nullptr; |
NumVars = 0; |
} |
@@ -128,6 +140,9 @@ protected: |
// within its constant pool. It is used for building the constant |
// pool in the object code and for referencing its entries. |
const uint32_t PoolEntryID; |
+ // Whether we should pool this constant. Usually Float/Double and pooled |
+ // Integers should be flagged true. |
+ bool shouldBePooled; |
}; |
// ConstantPrimitive<> wraps a primitive type. |
@@ -160,6 +175,11 @@ public: |
return Operand->getKind() == K; |
} |
+ virtual bool shouldBeRandomizedOrPooled(const GlobalContext *Ctx) override { |
+ (void)Ctx; |
+ return false; |
+ } |
+ |
private: |
ConstantPrimitive(Type Ty, PrimType Value, uint32_t PoolEntryID) |
: Constant(K, Ty, PoolEntryID), Value(Value) {} |
@@ -182,6 +202,10 @@ inline void ConstantInteger32::dump(const Cfg *, Ostream &Str) const { |
Str << static_cast<int32_t>(getValue()); |
} |
+// Specialization of the template member function for ConstantInteger32 |
+template <> |
+bool ConstantInteger32::shouldBeRandomizedOrPooled(const GlobalContext *Ctx); |
+ |
template <> |
inline void ConstantInteger64::dump(const Cfg *, Ostream &Str) const { |
if (!ALLOW_DUMP) |