aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Transforms/TransformInternals.h
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2001-11-05 18:30:53 +0000
committerChris Lattner <sabre@nondot.org>2001-11-05 18:30:53 +0000
commite4f4d8c3ec5f63ff71db2805d24b59c274c99258 (patch)
tree37fc2c61e37e23b4c7b865df508aba8f0c9baa06 /lib/Transforms/TransformInternals.h
parent8448fb5b24e6f8abb3225668d2f8f3058fb2c64c (diff)
downloadexternal_llvm-e4f4d8c3ec5f63ff71db2805d24b59c274c99258.zip
external_llvm-e4f4d8c3ec5f63ff71db2805d24b59c274c99258.tar.gz
external_llvm-e4f4d8c3ec5f63ff71db2805d24b59c274c99258.tar.bz2
Use the expression map correctly.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1140 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/TransformInternals.h')
-rw-r--r--lib/Transforms/TransformInternals.h48
1 files changed, 46 insertions, 2 deletions
diff --git a/lib/Transforms/TransformInternals.h b/lib/Transforms/TransformInternals.h
index e6e65ef..5c753c5 100644
--- a/lib/Transforms/TransformInternals.h
+++ b/lib/Transforms/TransformInternals.h
@@ -9,8 +9,10 @@
#define TRANSFORM_INTERNALS_H
#include "llvm/BasicBlock.h"
+#include "llvm/Instruction.h"
#include "llvm/Target/TargetData.h"
#include <map>
+#include <set>
// TargetData Hack: Eventually we will have annotations given to us by the
// backend so that we know stuff about type size and alignments. For now
@@ -43,8 +45,20 @@ void ReplaceInstWithInst(BasicBlock::InstListType &BIL,
// ------------- Expression Conversion ---------------------
-typedef map<const Value*, const Type*> ValueTypeCache;
-typedef map<const Value*, Value*> ValueMapCache;
+typedef map<const Value*, const Type*> ValueTypeCache;
+
+struct ValueMapCache {
+ // Operands mapped - Contains an entry if the first value (the user) has had
+ // the second value (the operand) mapped already.
+ //
+ set<pair<const User*, const Value*> > OperandsMapped;
+
+ // Expression Map - Contains an entry from the old value to the new value of
+ // an expression that has been converted over.
+ //
+ map<const Value *, Value *> ExprMap;
+ typedef map<const Value *, Value *> ExprMapTy;
+};
// RetValConvertableToType - Return true if it is possible
bool RetValConvertableToType(Value *V, const Type *Ty,
@@ -53,4 +67,34 @@ bool RetValConvertableToType(Value *V, const Type *Ty,
void ConvertUsersType(Value *V, Value *NewVal, ValueMapCache &VMC);
+//===----------------------------------------------------------------------===//
+// ValueHandle Class - Smart pointer that occupies a slot on the users USE list
+// that prevents it from being destroyed. This "looks" like an Instruction
+// with Opcode UserOp1.
+//
+class ValueHandle : public Instruction {
+ ValueHandle(const ValueHandle &); // DO NOT IMPLEMENT
+public:
+ ValueHandle(Value *V) : Instruction(Type::VoidTy, UserOp1, "") {
+ Operands.push_back(Use(V, this));
+ }
+
+ ~ValueHandle();
+
+ virtual Instruction *clone() const { abort(); return 0; }
+
+ virtual const char *getOpcodeName() const {
+ return "ValueHandle";
+ }
+
+ // Methods for support type inquiry through isa, cast, and dyn_cast:
+ static inline bool classof(const ValueHandle *) { return true; }
+ static inline bool classof(const Instruction *I) {
+ return (I->getOpcode() == Instruction::UserOp1);
+ }
+ static inline bool classof(const Value *V) {
+ return isa<Instruction>(V) && classof(cast<Instruction>(V));
+ }
+};
+
#endif