mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-27 13:30:05 +00:00
[unwind removal] Remove all of the code for the dead 'unwind' instruction. There
were no 'unwind' instructions being generated before this, so this is in effect a no-op. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@149906 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
3e9719e1f3
commit
8833ef03b9
@ -200,9 +200,7 @@ typedef enum {
|
||||
|
||||
/* Exception Handling Operators */
|
||||
LLVMResume = 58,
|
||||
LLVMLandingPad = 59,
|
||||
LLVMUnwind = 60
|
||||
|
||||
LLVMLandingPad = 59
|
||||
|
||||
} LLVMOpcode;
|
||||
|
||||
|
@ -99,81 +99,80 @@ HANDLE_TERM_INST ( 2, Br , BranchInst)
|
||||
HANDLE_TERM_INST ( 3, Switch , SwitchInst)
|
||||
HANDLE_TERM_INST ( 4, IndirectBr , IndirectBrInst)
|
||||
HANDLE_TERM_INST ( 5, Invoke , InvokeInst)
|
||||
HANDLE_TERM_INST ( 6, Unwind , UnwindInst)
|
||||
HANDLE_TERM_INST ( 7, Resume , ResumeInst)
|
||||
HANDLE_TERM_INST ( 8, Unreachable, UnreachableInst)
|
||||
LAST_TERM_INST ( 8)
|
||||
HANDLE_TERM_INST ( 6, Resume , ResumeInst)
|
||||
HANDLE_TERM_INST ( 7, Unreachable, UnreachableInst)
|
||||
LAST_TERM_INST ( 7)
|
||||
|
||||
// Standard binary operators...
|
||||
FIRST_BINARY_INST( 9)
|
||||
HANDLE_BINARY_INST( 9, Add , BinaryOperator)
|
||||
HANDLE_BINARY_INST(10, FAdd , BinaryOperator)
|
||||
HANDLE_BINARY_INST(11, Sub , BinaryOperator)
|
||||
HANDLE_BINARY_INST(12, FSub , BinaryOperator)
|
||||
HANDLE_BINARY_INST(13, Mul , BinaryOperator)
|
||||
HANDLE_BINARY_INST(14, FMul , BinaryOperator)
|
||||
HANDLE_BINARY_INST(15, UDiv , BinaryOperator)
|
||||
HANDLE_BINARY_INST(16, SDiv , BinaryOperator)
|
||||
HANDLE_BINARY_INST(17, FDiv , BinaryOperator)
|
||||
HANDLE_BINARY_INST(18, URem , BinaryOperator)
|
||||
HANDLE_BINARY_INST(19, SRem , BinaryOperator)
|
||||
HANDLE_BINARY_INST(20, FRem , BinaryOperator)
|
||||
FIRST_BINARY_INST( 8)
|
||||
HANDLE_BINARY_INST( 8, Add , BinaryOperator)
|
||||
HANDLE_BINARY_INST( 9, FAdd , BinaryOperator)
|
||||
HANDLE_BINARY_INST(10, Sub , BinaryOperator)
|
||||
HANDLE_BINARY_INST(11, FSub , BinaryOperator)
|
||||
HANDLE_BINARY_INST(12, Mul , BinaryOperator)
|
||||
HANDLE_BINARY_INST(13, FMul , BinaryOperator)
|
||||
HANDLE_BINARY_INST(14, UDiv , BinaryOperator)
|
||||
HANDLE_BINARY_INST(15, SDiv , BinaryOperator)
|
||||
HANDLE_BINARY_INST(16, FDiv , BinaryOperator)
|
||||
HANDLE_BINARY_INST(17, URem , BinaryOperator)
|
||||
HANDLE_BINARY_INST(18, SRem , BinaryOperator)
|
||||
HANDLE_BINARY_INST(19, FRem , BinaryOperator)
|
||||
|
||||
// Logical operators (integer operands)
|
||||
HANDLE_BINARY_INST(21, Shl , BinaryOperator) // Shift left (logical)
|
||||
HANDLE_BINARY_INST(22, LShr , BinaryOperator) // Shift right (logical)
|
||||
HANDLE_BINARY_INST(23, AShr , BinaryOperator) // Shift right (arithmetic)
|
||||
HANDLE_BINARY_INST(24, And , BinaryOperator)
|
||||
HANDLE_BINARY_INST(25, Or , BinaryOperator)
|
||||
HANDLE_BINARY_INST(26, Xor , BinaryOperator)
|
||||
LAST_BINARY_INST(26)
|
||||
HANDLE_BINARY_INST(20, Shl , BinaryOperator) // Shift left (logical)
|
||||
HANDLE_BINARY_INST(21, LShr , BinaryOperator) // Shift right (logical)
|
||||
HANDLE_BINARY_INST(22, AShr , BinaryOperator) // Shift right (arithmetic)
|
||||
HANDLE_BINARY_INST(23, And , BinaryOperator)
|
||||
HANDLE_BINARY_INST(24, Or , BinaryOperator)
|
||||
HANDLE_BINARY_INST(25, Xor , BinaryOperator)
|
||||
LAST_BINARY_INST(25)
|
||||
|
||||
// Memory operators...
|
||||
FIRST_MEMORY_INST(27)
|
||||
HANDLE_MEMORY_INST(27, Alloca, AllocaInst) // Stack management
|
||||
HANDLE_MEMORY_INST(28, Load , LoadInst ) // Memory manipulation instrs
|
||||
HANDLE_MEMORY_INST(29, Store , StoreInst )
|
||||
HANDLE_MEMORY_INST(30, GetElementPtr, GetElementPtrInst)
|
||||
HANDLE_MEMORY_INST(31, Fence , FenceInst )
|
||||
HANDLE_MEMORY_INST(32, AtomicCmpXchg , AtomicCmpXchgInst )
|
||||
HANDLE_MEMORY_INST(33, AtomicRMW , AtomicRMWInst )
|
||||
LAST_MEMORY_INST(33)
|
||||
FIRST_MEMORY_INST(26)
|
||||
HANDLE_MEMORY_INST(26, Alloca, AllocaInst) // Stack management
|
||||
HANDLE_MEMORY_INST(27, Load , LoadInst ) // Memory manipulation instrs
|
||||
HANDLE_MEMORY_INST(28, Store , StoreInst )
|
||||
HANDLE_MEMORY_INST(29, GetElementPtr, GetElementPtrInst)
|
||||
HANDLE_MEMORY_INST(30, Fence , FenceInst )
|
||||
HANDLE_MEMORY_INST(31, AtomicCmpXchg , AtomicCmpXchgInst )
|
||||
HANDLE_MEMORY_INST(32, AtomicRMW , AtomicRMWInst )
|
||||
LAST_MEMORY_INST(32)
|
||||
|
||||
// Cast operators ...
|
||||
// NOTE: The order matters here because CastInst::isEliminableCastPair
|
||||
// NOTE: (see Instructions.cpp) encodes a table based on this ordering.
|
||||
FIRST_CAST_INST(34)
|
||||
HANDLE_CAST_INST(34, Trunc , TruncInst ) // Truncate integers
|
||||
HANDLE_CAST_INST(35, ZExt , ZExtInst ) // Zero extend integers
|
||||
HANDLE_CAST_INST(36, SExt , SExtInst ) // Sign extend integers
|
||||
HANDLE_CAST_INST(37, FPToUI , FPToUIInst ) // floating point -> UInt
|
||||
HANDLE_CAST_INST(38, FPToSI , FPToSIInst ) // floating point -> SInt
|
||||
HANDLE_CAST_INST(39, UIToFP , UIToFPInst ) // UInt -> floating point
|
||||
HANDLE_CAST_INST(40, SIToFP , SIToFPInst ) // SInt -> floating point
|
||||
HANDLE_CAST_INST(41, FPTrunc , FPTruncInst ) // Truncate floating point
|
||||
HANDLE_CAST_INST(42, FPExt , FPExtInst ) // Extend floating point
|
||||
HANDLE_CAST_INST(43, PtrToInt, PtrToIntInst) // Pointer -> Integer
|
||||
HANDLE_CAST_INST(44, IntToPtr, IntToPtrInst) // Integer -> Pointer
|
||||
HANDLE_CAST_INST(45, BitCast , BitCastInst ) // Type cast
|
||||
LAST_CAST_INST(45)
|
||||
FIRST_CAST_INST(33)
|
||||
HANDLE_CAST_INST(33, Trunc , TruncInst ) // Truncate integers
|
||||
HANDLE_CAST_INST(34, ZExt , ZExtInst ) // Zero extend integers
|
||||
HANDLE_CAST_INST(35, SExt , SExtInst ) // Sign extend integers
|
||||
HANDLE_CAST_INST(36, FPToUI , FPToUIInst ) // floating point -> UInt
|
||||
HANDLE_CAST_INST(37, FPToSI , FPToSIInst ) // floating point -> SInt
|
||||
HANDLE_CAST_INST(38, UIToFP , UIToFPInst ) // UInt -> floating point
|
||||
HANDLE_CAST_INST(39, SIToFP , SIToFPInst ) // SInt -> floating point
|
||||
HANDLE_CAST_INST(40, FPTrunc , FPTruncInst ) // Truncate floating point
|
||||
HANDLE_CAST_INST(41, FPExt , FPExtInst ) // Extend floating point
|
||||
HANDLE_CAST_INST(42, PtrToInt, PtrToIntInst) // Pointer -> Integer
|
||||
HANDLE_CAST_INST(43, IntToPtr, IntToPtrInst) // Integer -> Pointer
|
||||
HANDLE_CAST_INST(44, BitCast , BitCastInst ) // Type cast
|
||||
LAST_CAST_INST(44)
|
||||
|
||||
// Other operators...
|
||||
FIRST_OTHER_INST(46)
|
||||
HANDLE_OTHER_INST(46, ICmp , ICmpInst ) // Integer comparison instruction
|
||||
HANDLE_OTHER_INST(47, FCmp , FCmpInst ) // Floating point comparison instr.
|
||||
HANDLE_OTHER_INST(48, PHI , PHINode ) // PHI node instruction
|
||||
HANDLE_OTHER_INST(49, Call , CallInst ) // Call a function
|
||||
HANDLE_OTHER_INST(50, Select , SelectInst ) // select instruction
|
||||
HANDLE_OTHER_INST(51, UserOp1, Instruction) // May be used internally in a pass
|
||||
HANDLE_OTHER_INST(52, UserOp2, Instruction) // Internal to passes only
|
||||
HANDLE_OTHER_INST(53, VAArg , VAArgInst ) // vaarg instruction
|
||||
HANDLE_OTHER_INST(54, ExtractElement, ExtractElementInst)// extract from vector
|
||||
HANDLE_OTHER_INST(55, InsertElement, InsertElementInst) // insert into vector
|
||||
HANDLE_OTHER_INST(56, ShuffleVector, ShuffleVectorInst) // shuffle two vectors.
|
||||
HANDLE_OTHER_INST(57, ExtractValue, ExtractValueInst)// extract from aggregate
|
||||
HANDLE_OTHER_INST(58, InsertValue, InsertValueInst) // insert into aggregate
|
||||
HANDLE_OTHER_INST(59, LandingPad, LandingPadInst) // Landing pad instruction.
|
||||
LAST_OTHER_INST(59)
|
||||
FIRST_OTHER_INST(45)
|
||||
HANDLE_OTHER_INST(45, ICmp , ICmpInst ) // Integer comparison instruction
|
||||
HANDLE_OTHER_INST(46, FCmp , FCmpInst ) // Floating point comparison instr.
|
||||
HANDLE_OTHER_INST(47, PHI , PHINode ) // PHI node instruction
|
||||
HANDLE_OTHER_INST(48, Call , CallInst ) // Call a function
|
||||
HANDLE_OTHER_INST(49, Select , SelectInst ) // select instruction
|
||||
HANDLE_OTHER_INST(50, UserOp1, Instruction) // May be used internally in a pass
|
||||
HANDLE_OTHER_INST(51, UserOp2, Instruction) // Internal to passes only
|
||||
HANDLE_OTHER_INST(52, VAArg , VAArgInst ) // vaarg instruction
|
||||
HANDLE_OTHER_INST(53, ExtractElement, ExtractElementInst)// extract from vector
|
||||
HANDLE_OTHER_INST(54, InsertElement, InsertElementInst) // insert into vector
|
||||
HANDLE_OTHER_INST(55, ShuffleVector, ShuffleVectorInst) // shuffle two vectors.
|
||||
HANDLE_OTHER_INST(56, ExtractValue, ExtractValueInst)// extract from aggregate
|
||||
HANDLE_OTHER_INST(57, InsertValue, InsertValueInst) // insert into aggregate
|
||||
HANDLE_OTHER_INST(58, LandingPad, LandingPadInst) // Landing pad instruction.
|
||||
LAST_OTHER_INST(58)
|
||||
|
||||
#undef FIRST_TERM_INST
|
||||
#undef HANDLE_TERM_INST
|
||||
|
@ -2972,42 +2972,6 @@ InvokeInst::InvokeInst(Value *Func,
|
||||
|
||||
DEFINE_TRANSPARENT_OPERAND_ACCESSORS(InvokeInst, Value)
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// UnwindInst Class
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
//===---------------------------------------------------------------------------
|
||||
/// UnwindInst - Immediately exit the current function, unwinding the stack
|
||||
/// until an invoke instruction is found.
|
||||
///
|
||||
class UnwindInst : public TerminatorInst {
|
||||
void *operator new(size_t, unsigned); // DO NOT IMPLEMENT
|
||||
protected:
|
||||
virtual UnwindInst *clone_impl() const;
|
||||
public:
|
||||
// allocate space for exactly zero operands
|
||||
void *operator new(size_t s) {
|
||||
return User::operator new(s, 0);
|
||||
}
|
||||
explicit UnwindInst(LLVMContext &C, Instruction *InsertBefore = 0);
|
||||
explicit UnwindInst(LLVMContext &C, BasicBlock *InsertAtEnd);
|
||||
|
||||
unsigned getNumSuccessors() const { return 0; }
|
||||
|
||||
// Methods for support type inquiry through isa, cast, and dyn_cast:
|
||||
static inline bool classof(const UnwindInst *) { return true; }
|
||||
static inline bool classof(const Instruction *I) {
|
||||
return I->getOpcode() == Instruction::Unwind;
|
||||
}
|
||||
static inline bool classof(const Value *V) {
|
||||
return isa<Instruction>(V) && classof(cast<Instruction>(V));
|
||||
}
|
||||
private:
|
||||
virtual BasicBlock *getSuccessorV(unsigned idx) const;
|
||||
virtual unsigned getNumSuccessorsV() const;
|
||||
virtual void setSuccessorV(unsigned idx, BasicBlock *B);
|
||||
};
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// ResumeInst Class
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -162,7 +162,6 @@ public:
|
||||
RetTy visitSwitchInst(SwitchInst &I) { DELEGATE(TerminatorInst);}
|
||||
RetTy visitIndirectBrInst(IndirectBrInst &I) { DELEGATE(TerminatorInst);}
|
||||
RetTy visitInvokeInst(InvokeInst &I) { DELEGATE(TerminatorInst);}
|
||||
RetTy visitUnwindInst(UnwindInst &I) { DELEGATE(TerminatorInst);}
|
||||
RetTy visitResumeInst(ResumeInst &I) { DELEGATE(TerminatorInst);}
|
||||
RetTy visitUnreachableInst(UnreachableInst &I) { DELEGATE(TerminatorInst);}
|
||||
RetTy visitICmpInst(ICmpInst &I) { DELEGATE(CmpInst);}
|
||||
|
@ -56,21 +56,13 @@ struct ClonedCodeInfo {
|
||||
/// call instruction.
|
||||
bool ContainsCalls;
|
||||
|
||||
/// ContainsUnwinds - This is set to true if the cloned code contains an
|
||||
/// unwind instruction.
|
||||
bool ContainsUnwinds;
|
||||
|
||||
/// ContainsDynamicAllocas - This is set to true if the cloned code contains
|
||||
/// a 'dynamic' alloca. Dynamic allocas are allocas that are either not in
|
||||
/// the entry block or they are in the entry block but are not a constant
|
||||
/// size.
|
||||
bool ContainsDynamicAllocas;
|
||||
|
||||
ClonedCodeInfo() {
|
||||
ContainsCalls = false;
|
||||
ContainsUnwinds = false;
|
||||
ContainsDynamicAllocas = false;
|
||||
}
|
||||
ClonedCodeInfo() : ContainsCalls(false), ContainsDynamicAllocas(false) {}
|
||||
};
|
||||
|
||||
|
||||
|
@ -1869,7 +1869,6 @@ bool llvm::isSafeToSpeculativelyExecute(const Value *V,
|
||||
case Instruction::Br:
|
||||
case Instruction::IndirectBr:
|
||||
case Instruction::Switch:
|
||||
case Instruction::Unwind:
|
||||
case Instruction::Unreachable:
|
||||
case Instruction::Fence:
|
||||
case Instruction::LandingPad:
|
||||
|
@ -1839,9 +1839,6 @@ void SelectionDAGBuilder::visitInvoke(const InvokeInst &I) {
|
||||
DAG.getBasicBlock(Return)));
|
||||
}
|
||||
|
||||
void SelectionDAGBuilder::visitUnwind(const UnwindInst &I) {
|
||||
}
|
||||
|
||||
void SelectionDAGBuilder::visitResume(const ResumeInst &RI) {
|
||||
llvm_unreachable("SelectionDAGBuilder shouldn't visit resume instructions!");
|
||||
}
|
||||
|
@ -72,7 +72,6 @@ class TargetLowering;
|
||||
class TruncInst;
|
||||
class UIToFPInst;
|
||||
class UnreachableInst;
|
||||
class UnwindInst;
|
||||
class VAArgInst;
|
||||
class ZExtInst;
|
||||
|
||||
@ -475,7 +474,6 @@ private:
|
||||
// These all get lowered before this pass.
|
||||
void visitInvoke(const InvokeInst &I);
|
||||
void visitResume(const ResumeInst &I);
|
||||
void visitUnwind(const UnwindInst &I);
|
||||
|
||||
void visitBinary(const User &I, unsigned OpCode);
|
||||
void visitShift(const User &I, unsigned Opcode);
|
||||
|
@ -74,7 +74,6 @@ STATISTIC(NumFastIselFailSwitch,"Fast isel fails on Switch");
|
||||
STATISTIC(NumFastIselFailIndirectBr,"Fast isel fails on IndirectBr");
|
||||
STATISTIC(NumFastIselFailInvoke,"Fast isel fails on Invoke");
|
||||
STATISTIC(NumFastIselFailResume,"Fast isel fails on Resume");
|
||||
STATISTIC(NumFastIselFailUnwind,"Fast isel fails on Unwind");
|
||||
STATISTIC(NumFastIselFailUnreachable,"Fast isel fails on Unreachable");
|
||||
|
||||
// Standard binary operators...
|
||||
@ -895,7 +894,6 @@ static void collectFailStats(const Instruction *I) {
|
||||
case Instruction::IndirectBr: NumFastIselFailIndirectBr++; return;
|
||||
case Instruction::Invoke: NumFastIselFailInvoke++; return;
|
||||
case Instruction::Resume: NumFastIselFailResume++; return;
|
||||
case Instruction::Unwind: NumFastIselFailUnwind++; return;
|
||||
case Instruction::Unreachable: NumFastIselFailUnreachable++; return;
|
||||
|
||||
// Standard binary operators...
|
||||
|
@ -60,7 +60,6 @@ BasicBlock *llvm::CloneBasicBlock(const BasicBlock *BB,
|
||||
|
||||
if (CodeInfo) {
|
||||
CodeInfo->ContainsCalls |= hasCalls;
|
||||
CodeInfo->ContainsUnwinds |= isa<UnwindInst>(BB->getTerminator());
|
||||
CodeInfo->ContainsDynamicAllocas |= hasDynamicAllocas;
|
||||
CodeInfo->ContainsDynamicAllocas |= hasStaticAllocas &&
|
||||
BB != &BB->getParent()->getEntryBlock();
|
||||
@ -337,7 +336,6 @@ void PruningFunctionCloner::CloneBlock(const BasicBlock *BB,
|
||||
|
||||
if (CodeInfo) {
|
||||
CodeInfo->ContainsCalls |= hasCalls;
|
||||
CodeInfo->ContainsUnwinds |= isa<UnwindInst>(OldTI);
|
||||
CodeInfo->ContainsDynamicAllocas |= hasDynamicAllocas;
|
||||
CodeInfo->ContainsDynamicAllocas |= hasStaticAllocas &&
|
||||
BB != &BB->getParent()->front();
|
||||
|
@ -214,8 +214,7 @@ static bool HandleCallsInBlockInlinedThroughInvoke(BasicBlock *BB,
|
||||
}
|
||||
|
||||
/// HandleInlinedInvoke - If we inlined an invoke site, we need to convert calls
|
||||
/// in the body of the inlined function into invokes and turn unwind
|
||||
/// instructions into branches to the invoke unwind dest.
|
||||
/// in the body of the inlined function into invokes.
|
||||
///
|
||||
/// II is the invoke instruction being inlined. FirstNewBlock is the first
|
||||
/// block of the inlined code (the last block is the end of the function),
|
||||
@ -230,7 +229,7 @@ static void HandleInlinedInvoke(InvokeInst *II, BasicBlock *FirstNewBlock,
|
||||
// start of the inlined code to its end, checking for stuff we need to
|
||||
// rewrite. If the code doesn't have calls or unwinds, we know there is
|
||||
// nothing to rewrite.
|
||||
if (!InlinedCodeInfo.ContainsCalls && !InlinedCodeInfo.ContainsUnwinds) {
|
||||
if (!InlinedCodeInfo.ContainsCalls) {
|
||||
// Now that everything is happy, we have one final detail. The PHI nodes in
|
||||
// the exception destination block still have entries due to the original
|
||||
// invoke instruction. Eliminate these entries (which might even delete the
|
||||
@ -244,27 +243,11 @@ static void HandleInlinedInvoke(InvokeInst *II, BasicBlock *FirstNewBlock,
|
||||
for (Function::iterator BB = FirstNewBlock, E = Caller->end(); BB != E; ++BB){
|
||||
if (InlinedCodeInfo.ContainsCalls)
|
||||
if (HandleCallsInBlockInlinedThroughInvoke(BB, Invoke)) {
|
||||
// Honor a request to skip the next block. We don't need to
|
||||
// consider UnwindInsts in this case either.
|
||||
// Honor a request to skip the next block.
|
||||
++BB;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (UnwindInst *UI = dyn_cast<UnwindInst>(BB->getTerminator())) {
|
||||
// An UnwindInst requires special handling when it gets inlined into an
|
||||
// invoke site. Once this happens, we know that the unwind would cause
|
||||
// a control transfer to the invoke exception destination, so we can
|
||||
// transform it into a direct branch to the exception destination.
|
||||
BranchInst::Create(InvokeDest, UI);
|
||||
|
||||
// Delete the unwind instruction!
|
||||
UI->eraseFromParent();
|
||||
|
||||
// Update any PHI nodes in the exceptional block to indicate that
|
||||
// there is now a new entry in them.
|
||||
Invoke.addIncomingPHIValuesFor(BB);
|
||||
}
|
||||
|
||||
if (ResumeInst *RI = dyn_cast<ResumeInst>(BB->getTerminator()))
|
||||
Invoke.forwardResume(RI);
|
||||
}
|
||||
@ -503,7 +486,6 @@ static void fixupLineNumbers(Function *Fn, Function::iterator FI,
|
||||
/// function by one level.
|
||||
bool llvm::InlineFunction(CallSite CS, InlineFunctionInfo &IFI) {
|
||||
Instruction *TheCall = CS.getInstruction();
|
||||
LLVMContext &Context = TheCall->getContext();
|
||||
assert(TheCall->getParent() && TheCall->getParent()->getParent() &&
|
||||
"Instruction not in function!");
|
||||
|
||||
@ -708,20 +690,6 @@ bool llvm::InlineFunction(CallSite CS, InlineFunctionInfo &IFI) {
|
||||
for (unsigned i = 0, e = Returns.size(); i != e; ++i) {
|
||||
IRBuilder<>(Returns[i]).CreateCall(StackRestore, SavedPtr);
|
||||
}
|
||||
|
||||
// Count the number of StackRestore calls we insert.
|
||||
unsigned NumStackRestores = Returns.size();
|
||||
|
||||
// If we are inlining an invoke instruction, insert restores before each
|
||||
// unwind. These unwinds will be rewritten into branches later.
|
||||
if (InlinedFunctionInfo.ContainsUnwinds && isa<InvokeInst>(TheCall)) {
|
||||
for (Function::iterator BB = FirstNewBlock, E = Caller->end();
|
||||
BB != E; ++BB)
|
||||
if (UnwindInst *UI = dyn_cast<UnwindInst>(BB->getTerminator())) {
|
||||
IRBuilder<>(UI).CreateCall(StackRestore, SavedPtr);
|
||||
++NumStackRestores;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If we are inlining tail call instruction through a call site that isn't
|
||||
@ -741,21 +709,8 @@ bool llvm::InlineFunction(CallSite CS, InlineFunctionInfo &IFI) {
|
||||
}
|
||||
}
|
||||
|
||||
// If we are inlining through a 'nounwind' call site then any inlined 'unwind'
|
||||
// instructions are unreachable.
|
||||
if (InlinedFunctionInfo.ContainsUnwinds && MarkNoUnwind)
|
||||
for (Function::iterator BB = FirstNewBlock, E = Caller->end();
|
||||
BB != E; ++BB) {
|
||||
TerminatorInst *Term = BB->getTerminator();
|
||||
if (isa<UnwindInst>(Term)) {
|
||||
new UnreachableInst(Context, Term);
|
||||
BB->getInstList().erase(Term);
|
||||
}
|
||||
}
|
||||
|
||||
// If we are inlining for an invoke instruction, we must make sure to rewrite
|
||||
// any inlined 'unwind' instructions into branches to the invoke exception
|
||||
// destination, and call instructions into invoke instructions.
|
||||
// any call instructions into invoke instructions.
|
||||
if (InvokeInst *II = dyn_cast<InvokeInst>(TheCall))
|
||||
HandleInlinedInvoke(II, FirstNewBlock, InlinedFunctionInfo);
|
||||
|
||||
|
@ -102,7 +102,6 @@ const char *Instruction::getOpcodeName(unsigned OpCode) {
|
||||
case IndirectBr: return "indirectbr";
|
||||
case Invoke: return "invoke";
|
||||
case Resume: return "resume";
|
||||
case Unwind: return "unwind";
|
||||
case Unreachable: return "unreachable";
|
||||
|
||||
// Standard binary operators...
|
||||
|
@ -630,32 +630,6 @@ BasicBlock *ReturnInst::getSuccessorV(unsigned idx) const {
|
||||
ReturnInst::~ReturnInst() {
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// UnwindInst Implementation
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
UnwindInst::UnwindInst(LLVMContext &Context, Instruction *InsertBefore)
|
||||
: TerminatorInst(Type::getVoidTy(Context), Instruction::Unwind,
|
||||
0, 0, InsertBefore) {
|
||||
}
|
||||
UnwindInst::UnwindInst(LLVMContext &Context, BasicBlock *InsertAtEnd)
|
||||
: TerminatorInst(Type::getVoidTy(Context), Instruction::Unwind,
|
||||
0, 0, InsertAtEnd) {
|
||||
}
|
||||
|
||||
|
||||
unsigned UnwindInst::getNumSuccessorsV() const {
|
||||
return getNumSuccessors();
|
||||
}
|
||||
|
||||
void UnwindInst::setSuccessorV(unsigned idx, BasicBlock *NewSucc) {
|
||||
llvm_unreachable("UnwindInst has no successors!");
|
||||
}
|
||||
|
||||
BasicBlock *UnwindInst::getSuccessorV(unsigned idx) const {
|
||||
llvm_unreachable("UnwindInst has no successors!");
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// ResumeInst Implementation
|
||||
//===----------------------------------------------------------------------===//
|
||||
@ -709,11 +683,11 @@ unsigned UnreachableInst::getNumSuccessorsV() const {
|
||||
}
|
||||
|
||||
void UnreachableInst::setSuccessorV(unsigned idx, BasicBlock *NewSucc) {
|
||||
llvm_unreachable("UnwindInst has no successors!");
|
||||
llvm_unreachable("UnreachableInst has no successors!");
|
||||
}
|
||||
|
||||
BasicBlock *UnreachableInst::getSuccessorV(unsigned idx) const {
|
||||
llvm_unreachable("UnwindInst has no successors!");
|
||||
llvm_unreachable("UnreachableInst has no successors!");
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
@ -3516,11 +3490,6 @@ ResumeInst *ResumeInst::clone_impl() const {
|
||||
return new(1) ResumeInst(*this);
|
||||
}
|
||||
|
||||
UnwindInst *UnwindInst::clone_impl() const {
|
||||
LLVMContext &Context = getContext();
|
||||
return new UnwindInst(Context);
|
||||
}
|
||||
|
||||
UnreachableInst *UnreachableInst::clone_impl() const {
|
||||
LLVMContext &Context = getContext();
|
||||
return new UnreachableInst(Context);
|
||||
|
Loading…
Reference in New Issue
Block a user