diff options
author | Chris Lattner <sabre@nondot.org> | 2002-07-17 17:11:33 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2002-07-17 17:11:33 +0000 |
commit | b1b4262387b0060af9c01297d146bb17ed361a84 (patch) | |
tree | 55ce125fa359cca895f12352760831876b1fbe47 /lib/Transforms/TransformInternals.h | |
parent | 1ab8425c1c09c051459ef3bae2ecb087716cc3f5 (diff) |
* Remove dead code from ExprTypeConvert.cpp
- I->use_empty() can never be true because of the IHolder's
* Fix bug: test/Regression/Transforms/LevelRaise/2002-07-16-SourceAndDestCrash.ll
- Add a new NewCasts member to VMC to keep track of casts that have been
created and to ensure there is always a reference to the cast.
- Extend ValueHandle a bit so it can be used in an STL container
- Make sure we destroy the ValueMapCache before verifying the function
in LevelRaise.cpp
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2936 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/TransformInternals.h')
-rw-r--r-- | lib/Transforms/TransformInternals.h | 73 |
1 files changed, 43 insertions, 30 deletions
diff --git a/lib/Transforms/TransformInternals.h b/lib/Transforms/TransformInternals.h index 6680d02b86..7a2dbf1b69 100644 --- a/lib/Transforms/TransformInternals.h +++ b/lib/Transforms/TransformInternals.h @@ -9,7 +9,6 @@ #define TRANSFORM_INTERNALS_H #include "llvm/BasicBlock.h" -#include "llvm/Instruction.h" #include "llvm/Target/TargetData.h" #include "llvm/DerivedTypes.h" #include "llvm/Constants.h" @@ -53,44 +52,17 @@ const Type *ConvertableToGEP(const Type *Ty, Value *V, BasicBlock::iterator *BI = 0); -// ------------- Expression Conversion --------------------- - -typedef std::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. - // - std::set<const User*> OperandsMapped; - - // Expression Map - Contains an entry from the old value to the new value of - // an expression that has been converted over. - // - std::map<const Value *, Value *> ExprMap; - typedef std::map<const Value *, Value *> ExprMapTy; -}; - - -bool ExpressionConvertableToType(Value *V, const Type *Ty, ValueTypeCache &Map); -Value *ConvertExpressionToType(Value *V, const Type *Ty, ValueMapCache &VMC); - -// ValueConvertableToType - Return true if it is possible -bool ValueConvertableToType(Value *V, const Type *Ty, - ValueTypeCache &ConvertedTypes); - -void ConvertValueToNewType(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 ValueMapCache; class ValueHandle : public Instruction { - ValueHandle(const ValueHandle &); // DO NOT IMPLEMENT ValueMapCache &Cache; public: ValueHandle(ValueMapCache &VMC, Value *V); + ValueHandle(const ValueHandle &); ~ValueHandle(); virtual Instruction *clone() const { abort(); return 0; } @@ -99,6 +71,10 @@ public: return "ValueHandle"; } + inline bool operator<(const ValueHandle &VH) const { + return getOperand(0) < VH.getOperand(0); + } + // 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) { @@ -109,6 +85,43 @@ public: } }; + +// ------------- Expression Conversion --------------------- + +typedef std::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. + // + std::set<const User*> OperandsMapped; + + // Expression Map - Contains an entry from the old value to the new value of + // an expression that has been converted over. + // + std::map<const Value *, Value *> ExprMap; + typedef std::map<const Value *, Value *> ExprMapTy; + + // Cast Map - Cast instructions can have their source and destination values + // changed independantly for each part. Because of this, our old naive + // implementation would create a TWO new cast instructions, which would cause + // all kinds of problems. Here we keep track of the newly allocated casts, so + // that we only create one for a particular instruction. + // + std::set<ValueHandle> NewCasts; +}; + + +bool ExpressionConvertableToType(Value *V, const Type *Ty, ValueTypeCache &Map); +Value *ConvertExpressionToType(Value *V, const Type *Ty, ValueMapCache &VMC); + +// ValueConvertableToType - Return true if it is possible +bool ValueConvertableToType(Value *V, const Type *Ty, + ValueTypeCache &ConvertedTypes); + +void ConvertValueToNewType(Value *V, Value *NewVal, ValueMapCache &VMC); + + // getStructOffsetType - Return a vector of offsets that are to be used to index // into the specified struct type to get as close as possible to index as we // can. Note that it is possible that we cannot get exactly to Offset, in which |