From d59f9706687d61ee6d646ddf07c5658197b48f9b Mon Sep 17 00:00:00 2001 From: Philip Reames Date: Tue, 26 May 2015 21:03:23 +0000 Subject: [PATCH] [PlaceSafepoints] Cleanup InsertSafepointPoll function While working on another change, I noticed that the naming in this function was mildly deceptive. While fixing that, I took the oppurtunity to modernize some of the code. NFC intended. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@238252 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/IR/BasicBlock.h | 1 + include/llvm/IR/Instruction.h | 1 + lib/IR/BasicBlock.cpp | 4 +++ lib/IR/Instruction.cpp | 5 +++ lib/Transforms/Scalar/PlaceSafepoints.cpp | 37 +++++++++++------------ 5 files changed, 28 insertions(+), 20 deletions(-) diff --git a/include/llvm/IR/BasicBlock.h b/include/llvm/IR/BasicBlock.h index 88b3b3e7fb8..66581bfedbe 100644 --- a/include/llvm/IR/BasicBlock.h +++ b/include/llvm/IR/BasicBlock.h @@ -116,6 +116,7 @@ public: /// /// Note: this is undefined behavior if the block does not have a parent. const Module *getModule() const; + Module *getModule(); /// \brief Returns the terminator instruction if the block is well formed or /// null if the block is not well formed. diff --git a/include/llvm/IR/Instruction.h b/include/llvm/IR/Instruction.h index 2b9bc778410..752c3f09bde 100644 --- a/include/llvm/IR/Instruction.h +++ b/include/llvm/IR/Instruction.h @@ -78,6 +78,7 @@ public: /// Note: this is undefined behavior if the instruction does not have a /// parent, or the parent basic block does not have a parent function. const Module *getModule() const; + Module *getModule(); /// removeFromParent - This method unlinks 'this' from the containing basic /// block, but does not delete it. diff --git a/lib/IR/BasicBlock.cpp b/lib/IR/BasicBlock.cpp index e6a4585a936..70ae3c39842 100644 --- a/lib/IR/BasicBlock.cpp +++ b/lib/IR/BasicBlock.cpp @@ -117,6 +117,10 @@ const Module *BasicBlock::getModule() const { return getParent()->getParent(); } +Module *BasicBlock::getModule() { + return getParent()->getParent(); +} + TerminatorInst *BasicBlock::getTerminator() { if (InstList.empty()) return nullptr; return dyn_cast(&InstList.back()); diff --git a/lib/IR/Instruction.cpp b/lib/IR/Instruction.cpp index 57c143cca2c..45bb296602c 100644 --- a/lib/IR/Instruction.cpp +++ b/lib/IR/Instruction.cpp @@ -58,6 +58,11 @@ const Module *Instruction::getModule() const { return getParent()->getModule(); } +Module *Instruction::getModule() { + return getParent()->getModule(); +} + + void Instruction::removeFromParent() { getParent()->getInstList().remove(this); } diff --git a/lib/Transforms/Scalar/PlaceSafepoints.cpp b/lib/Transforms/Scalar/PlaceSafepoints.cpp index 5d5be7a4bb6..3e3ea39bdb1 100644 --- a/lib/Transforms/Scalar/PlaceSafepoints.cpp +++ b/lib/Transforms/Scalar/PlaceSafepoints.cpp @@ -187,7 +187,7 @@ struct PlaceSafepoints : public FunctionPass { // not handle the parsability of state at the runtime call, that's the // callers job. static void -InsertSafepointPoll(Instruction *after, +InsertSafepointPoll(Instruction *InsertBefore, std::vector &ParsePointsNeeded /*rval*/); static bool isGCLeafFunction(const CallSite &CS); @@ -801,42 +801,39 @@ static bool isGCLeafFunction(const CallSite &CS) { } static void -InsertSafepointPoll(Instruction *term, +InsertSafepointPoll(Instruction *InsertBefore, std::vector &ParsePointsNeeded /*rval*/) { - Module *M = term->getParent()->getParent()->getParent(); - assert(M); + BasicBlock *OrigBB = InsertBefore->getParent(); + Module *M = InsertBefore->getModule(); + assert(M && "must be part of a module"); // Inline the safepoint poll implementation - this will get all the branch, // control flow, etc.. Most importantly, it will introduce the actual slow // path call - where we need to insert a safepoint (parsepoint). - FunctionType *ftype = - FunctionType::get(Type::getVoidTy(M->getContext()), false); - assert(ftype && "null?"); - // Note: This cast can fail if there's a function of the same name with a - // different type inserted previously - Function *F = - dyn_cast(M->getOrInsertFunction("gc.safepoint_poll", ftype)); - assert(F && "void @gc.safepoint_poll() must be defined"); + + auto *F = M->getFunction(GCSafepointPollName); + assert(F->getType()->getElementType() == + FunctionType::get(Type::getVoidTy(M->getContext()), false) && + "gc.safepoint_poll declared with wrong type"); assert(!F->empty() && "gc.safepoint_poll must be a non-empty function"); - CallInst *poll = CallInst::Create(F, "", term); + CallInst *PollCall = CallInst::Create(F, "", InsertBefore); // Record some information about the call site we're replacing - BasicBlock *OrigBB = term->getParent(); - BasicBlock::iterator before(poll), after(poll); + BasicBlock::iterator before(PollCall), after(PollCall); bool isBegin(false); - if (before == term->getParent()->begin()) { + if (before == OrigBB->begin()) { isBegin = true; } else { before--; } after++; - assert(after != poll->getParent()->end() && "must have successor"); + assert(after != OrigBB->end() && "must have successor"); // do the actual inlining InlineFunctionInfo IFI; - bool inlineStatus = InlineFunction(poll, IFI); - assert(inlineStatus && "inline must succeed"); - (void)inlineStatus; // suppress warning in release-asserts + bool InlineStatus = InlineFunction(PollCall, IFI); + assert(InlineStatus && "inline must succeed"); + (void)InlineStatus; // suppress warning in release-asserts // Check post conditions assert(IFI.StaticAllocas.empty() && "can't have allocs"); -- 2.34.1