From dd56927846f8092cbca6084de584cdc18117b0aa Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 20 Nov 2003 17:44:37 +0000 Subject: [PATCH] * Add new constructors to allow insertion of terminator instructions at the end of basic blocks. * Document some confusing constructor combinations * Move a ReturnInst method out-of-line, so that the vtable and type info don't need to be emitted to every translation unit that uses the class. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10106 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/InstrTypes.h | 1 + include/llvm/iTerminators.h | 37 +++++++++++++++++++++++++++++++------ 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/include/llvm/InstrTypes.h b/include/llvm/InstrTypes.h index 70cb742d96d..30ba130b892 100644 --- a/include/llvm/InstrTypes.h +++ b/include/llvm/InstrTypes.h @@ -34,6 +34,7 @@ protected: const std::string &Name = "", Instruction *InsertBefore = 0) : Instruction(Ty, iType, Name, InsertBefore) { } + TerminatorInst(Instruction::TermOps iType, BasicBlock *InsertAtEnd); public: /// Terminators must implement the methods required by Instruction... diff --git a/include/llvm/iTerminators.h b/include/llvm/iTerminators.h index a27ffdf81da..7cf14ac1150 100644 --- a/include/llvm/iTerminators.h +++ b/include/llvm/iTerminators.h @@ -33,6 +33,13 @@ class ReturnInst : public TerminatorInst { } } public: + // ReturnInst constructors: + // ReturnInst() - 'ret void' instruction + // ReturnInst(Value* X) - 'ret X' instruction + // ReturnInst( null, Inst *) - 'ret void' instruction, insert before I + // ReturnInst(Value* X, Inst *I) - 'ret X' instruction, insert before I + // ReturnInst( null, BB *B) - 'ret void' instruction, insert @ end of BB + // ReturnInst(Value* X, BB *B) - 'ret X' instruction, insert @ end of BB ReturnInst(Value *RetVal = 0, Instruction *InsertBefore = 0) : TerminatorInst(Instruction::Ret, InsertBefore) { if (RetVal) { @@ -40,6 +47,13 @@ public: Operands.push_back(Use(RetVal, this)); } } + ReturnInst(Value *RetVal, BasicBlock *InsertAtEnd) + : TerminatorInst(Instruction::Ret, InsertAtEnd) { + if (RetVal) { + Operands.reserve(1); + Operands.push_back(Use(RetVal, this)); + } + } virtual Instruction *clone() const { return new ReturnInst(*this); } @@ -55,9 +69,7 @@ public: abort(); return 0; } - virtual void setSuccessor(unsigned idx, BasicBlock *NewSucc) { - assert(0 && "ReturnInst has no successors!"); - } + virtual void setSuccessor(unsigned idx, BasicBlock *NewSucc); virtual unsigned getNumSuccessors() const { return 0; } // Methods for support type inquiry through isa, cast, and dyn_cast: @@ -76,10 +88,19 @@ public: class BranchInst : public TerminatorInst { BranchInst(const BranchInst &BI); public: - // If cond = null, then is an unconditional br... - BranchInst(BasicBlock *IfTrue, BasicBlock *IfFalse, Value *cond = 0, - Instruction *InsertBefore = 0); + // BranchInst constructors (where {B, T, F} are blocks, and C is a condition): + // BranchInst(BB *B) - 'br B' + // BranchInst(BB* T, BB *F, Value *C) - 'br C, T, F' + // BranchInst(BB* B, Inst *I) - 'br B' insert before I + // BranchInst(BB* T, BB *F, Value *C, Inst *I) - 'br C, T, F', insert before I + // BranchInst(BB* B, BB *I) - 'br B' insert at end + // BranchInst(BB* T, BB *F, Value *C, BB *I) - 'br C, T, F', insert at end BranchInst(BasicBlock *IfTrue, Instruction *InsertBefore = 0); + BranchInst(BasicBlock *IfTrue, BasicBlock *IfFalse, Value *cond, + Instruction *InsertBefore = 0); + BranchInst(BasicBlock *IfTrue, BasicBlock *InsertAtEnd); + BranchInst(BasicBlock *IfTrue, BasicBlock *IfFalse, Value *cond, + BasicBlock *InsertAtEnd); virtual Instruction *clone() const { return new BranchInst(*this); } @@ -142,6 +163,7 @@ class SwitchInst : public TerminatorInst { SwitchInst(const SwitchInst &RI); public: SwitchInst(Value *Value, BasicBlock *Default, Instruction *InsertBefore = 0); + SwitchInst(Value *Value, BasicBlock *Default, BasicBlock *InsertAtEnd); virtual Instruction *clone() const { return new SwitchInst(*this); } @@ -212,6 +234,9 @@ public: InvokeInst(Value *Fn, BasicBlock *IfNormal, BasicBlock *IfException, const std::vector &Params, const std::string &Name = "", Instruction *InsertBefore = 0); + InvokeInst(Value *Fn, BasicBlock *IfNormal, BasicBlock *IfException, + const std::vector &Params, const std::string &Name, + BasicBlock *InsertAtEnd); virtual Instruction *clone() const { return new InvokeInst(*this); }