From 0ecba60d26c90ac477e77eb1327ead7803fe272c Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 5 Nov 2001 18:30:53 +0000 Subject: Use the expression map correctly. llvm-svn: 1140 --- llvm/lib/Transforms/TransformInternals.h | 48 ++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) (limited to 'llvm/lib/Transforms/TransformInternals.h') 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 +#include // 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 ValueTypeCache; -typedef map ValueMapCache; +typedef map ValueTypeCache; + +struct ValueMapCache { + // Operands mapped - Contains an entry if the first value (the user) has had + // the second value (the operand) mapped already. + // + set > OperandsMapped; + + // Expression Map - Contains an entry from the old value to the new value of + // an expression that has been converted over. + // + map ExprMap; + typedef map 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(V) && classof(cast(V)); + } +}; + #endif -- cgit v1.2.3