summaryrefslogtreecommitdiffstats
path: root/llvm/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
commit0ecba60d26c90ac477e77eb1327ead7803fe272c (patch)
treeadde12e8de828825b9e7331cbe40c0a10e64acef /llvm/lib/Transforms/TransformInternals.h
parentad480c5a3467f729e575c1220820850471515755 (diff)
downloadbcm5719-llvm-0ecba60d26c90ac477e77eb1327ead7803fe272c.tar.gz
bcm5719-llvm-0ecba60d26c90ac477e77eb1327ead7803fe272c.zip
Use the expression map correctly.
llvm-svn: 1140
Diffstat (limited to 'llvm/lib/Transforms/TransformInternals.h')
-rw-r--r--llvm/lib/Transforms/TransformInternals.h48
1 files changed, 46 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/TransformInternals.h b/llvm/lib/Transforms/TransformInternals.h
index e6e65efd03d..5c753c506c0 100644
--- a/llvm/lib/Transforms/TransformInternals.h
+++ b/llvm/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
OpenPOWER on IntegriCloud