Use covariant return types for Instruction::clone, and eliminate

the forms of ExtractElementInst and InsertElementInst that are
equivalent to clone.

llvm-svn: 80041
This commit is contained in:
Dan Gohman 2009-08-25 22:29:08 +00:00
parent 3b1665eca5
commit faf516f34d
3 changed files with 26 additions and 33 deletions

View File

@ -53,7 +53,7 @@ protected:
virtual void setSuccessorV(unsigned idx, BasicBlock *B) = 0;
public:
virtual Instruction *clone(LLVMContext &Context) const = 0;
virtual TerminatorInst *clone(LLVMContext &Context) const = 0;
/// getNumSuccessors - Return the number of successors that this terminator
/// has.

View File

@ -78,7 +78,7 @@ public:
unsigned getAlignment() const { return (1u << SubclassData) >> 1; }
void setAlignment(unsigned Align);
virtual Instruction *clone(LLVMContext &Context) const = 0;
virtual AllocationInst *clone(LLVMContext &Context) const = 0;
// Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const AllocationInst *) { return true; }
@ -1276,10 +1276,6 @@ class ExtractElementInst : public Instruction {
ExtractElementInst(Value *Vec, Value *Idx, const Twine &NameStr,
BasicBlock *InsertAtEnd);
public:
static ExtractElementInst *Create(const ExtractElementInst &EE) {
return Create(EE.getOperand(0), EE.getOperand(1));
}
static ExtractElementInst *Create(Value *Vec, Value *Idx,
const Twine &NameStr = "",
Instruction *InsertBefore = 0) {
@ -1330,9 +1326,6 @@ class InsertElementInst : public Instruction {
InsertElementInst(Value *Vec, Value *NewElt, Value *Idx,
const Twine &NameStr, BasicBlock *InsertAtEnd);
public:
static InsertElementInst *Create(const InsertElementInst &IE) {
return Create(IE.getOperand(0), IE.getOperand(1), IE.getOperand(2));
}
static InsertElementInst *Create(Value *Vec, Value *NewElt, Value *Idx,
const Twine &NameStr = "",
Instruction *InsertBefore = 0) {
@ -2638,7 +2631,7 @@ public:
);
/// @brief Clone an identical TruncInst
virtual CastInst *clone(LLVMContext &Context) const;
virtual TruncInst *clone(LLVMContext &Context) const;
/// @brief Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const TruncInst *) { return true; }
@ -2674,7 +2667,7 @@ public:
);
/// @brief Clone an identical ZExtInst
virtual CastInst *clone(LLVMContext &Context) const;
virtual ZExtInst *clone(LLVMContext &Context) const;
/// @brief Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const ZExtInst *) { return true; }
@ -2710,7 +2703,7 @@ public:
);
/// @brief Clone an identical SExtInst
virtual CastInst *clone(LLVMContext &Context) const;
virtual SExtInst *clone(LLVMContext &Context) const;
/// @brief Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const SExtInst *) { return true; }
@ -2746,7 +2739,7 @@ public:
);
/// @brief Clone an identical FPTruncInst
virtual CastInst *clone(LLVMContext &Context) const;
virtual FPTruncInst *clone(LLVMContext &Context) const;
/// @brief Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const FPTruncInst *) { return true; }
@ -2782,7 +2775,7 @@ public:
);
/// @brief Clone an identical FPExtInst
virtual CastInst *clone(LLVMContext &Context) const;
virtual FPExtInst *clone(LLVMContext &Context) const;
/// @brief Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const FPExtInst *) { return true; }
@ -2818,7 +2811,7 @@ public:
);
/// @brief Clone an identical UIToFPInst
virtual CastInst *clone(LLVMContext &Context) const;
virtual UIToFPInst *clone(LLVMContext &Context) const;
/// @brief Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const UIToFPInst *) { return true; }
@ -2854,7 +2847,7 @@ public:
);
/// @brief Clone an identical SIToFPInst
virtual CastInst *clone(LLVMContext &Context) const;
virtual SIToFPInst *clone(LLVMContext &Context) const;
/// @brief Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const SIToFPInst *) { return true; }
@ -2890,7 +2883,7 @@ public:
);
/// @brief Clone an identical FPToUIInst
virtual CastInst *clone(LLVMContext &Context) const;
virtual FPToUIInst *clone(LLVMContext &Context) const;
/// @brief Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const FPToUIInst *) { return true; }
@ -2926,7 +2919,7 @@ public:
);
/// @brief Clone an identical FPToSIInst
virtual CastInst *clone(LLVMContext &Context) const;
virtual FPToSIInst *clone(LLVMContext &Context) const;
/// @brief Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const FPToSIInst *) { return true; }
@ -2962,7 +2955,7 @@ public:
);
/// @brief Clone an identical IntToPtrInst
virtual CastInst *clone(LLVMContext &Context) const;
virtual IntToPtrInst *clone(LLVMContext &Context) const;
// Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const IntToPtrInst *) { return true; }
@ -2998,7 +2991,7 @@ public:
);
/// @brief Clone an identical PtrToIntInst
virtual CastInst *clone(LLVMContext &Context) const;
virtual PtrToIntInst *clone(LLVMContext &Context) const;
// Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const PtrToIntInst *) { return true; }
@ -3034,7 +3027,7 @@ public:
);
/// @brief Clone an identical BitCastInst
virtual CastInst *clone(LLVMContext &Context) const;
virtual BitCastInst *clone(LLVMContext &Context) const;
// Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const BitCastInst *) { return true; }

View File

@ -2933,73 +2933,73 @@ StoreInst *StoreInst::clone(LLVMContext&) const {
return New;
}
CastInst *TruncInst::clone(LLVMContext&) const {
TruncInst *TruncInst::clone(LLVMContext&) const {
TruncInst *New = new TruncInst(getOperand(0), getType());
New->SubclassOptionalData = SubclassOptionalData;
return New;
}
CastInst *ZExtInst::clone(LLVMContext&) const {
ZExtInst *ZExtInst::clone(LLVMContext&) const {
ZExtInst *New = new ZExtInst(getOperand(0), getType());
New->SubclassOptionalData = SubclassOptionalData;
return New;
}
CastInst *SExtInst::clone(LLVMContext&) const {
SExtInst *SExtInst::clone(LLVMContext&) const {
SExtInst *New = new SExtInst(getOperand(0), getType());
New->SubclassOptionalData = SubclassOptionalData;
return New;
}
CastInst *FPTruncInst::clone(LLVMContext&) const {
FPTruncInst *FPTruncInst::clone(LLVMContext&) const {
FPTruncInst *New = new FPTruncInst(getOperand(0), getType());
New->SubclassOptionalData = SubclassOptionalData;
return New;
}
CastInst *FPExtInst::clone(LLVMContext&) const {
FPExtInst *FPExtInst::clone(LLVMContext&) const {
FPExtInst *New = new FPExtInst(getOperand(0), getType());
New->SubclassOptionalData = SubclassOptionalData;
return New;
}
CastInst *UIToFPInst::clone(LLVMContext&) const {
UIToFPInst *UIToFPInst::clone(LLVMContext&) const {
UIToFPInst *New = new UIToFPInst(getOperand(0), getType());
New->SubclassOptionalData = SubclassOptionalData;
return New;
}
CastInst *SIToFPInst::clone(LLVMContext&) const {
SIToFPInst *SIToFPInst::clone(LLVMContext&) const {
SIToFPInst *New = new SIToFPInst(getOperand(0), getType());
New->SubclassOptionalData = SubclassOptionalData;
return New;
}
CastInst *FPToUIInst::clone(LLVMContext&) const {
FPToUIInst *FPToUIInst::clone(LLVMContext&) const {
FPToUIInst *New = new FPToUIInst(getOperand(0), getType());
New->SubclassOptionalData = SubclassOptionalData;
return New;
}
CastInst *FPToSIInst::clone(LLVMContext&) const {
FPToSIInst *FPToSIInst::clone(LLVMContext&) const {
FPToSIInst *New = new FPToSIInst(getOperand(0), getType());
New->SubclassOptionalData = SubclassOptionalData;
return New;
}
CastInst *PtrToIntInst::clone(LLVMContext&) const {
PtrToIntInst *PtrToIntInst::clone(LLVMContext&) const {
PtrToIntInst *New = new PtrToIntInst(getOperand(0), getType());
New->SubclassOptionalData = SubclassOptionalData;
return New;
}
CastInst *IntToPtrInst::clone(LLVMContext&) const {
IntToPtrInst *IntToPtrInst::clone(LLVMContext&) const {
IntToPtrInst *New = new IntToPtrInst(getOperand(0), getType());
New->SubclassOptionalData = SubclassOptionalData;
return New;
}
CastInst *BitCastInst::clone(LLVMContext&) const {
BitCastInst *BitCastInst::clone(LLVMContext&) const {
BitCastInst *New = new BitCastInst(getOperand(0), getType());
New->SubclassOptionalData = SubclassOptionalData;
return New;