From: Sanjoy Das Date: Thu, 8 Oct 2015 23:18:38 +0000 (+0000) Subject: [RS4GC] Refactoring to make a later change easier, NFCI X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=9d523d999ecccef04c7f0faff9871a3f2d0d2c5a;p=oota-llvm.git [RS4GC] Refactoring to make a later change easier, NFCI Summary: These non-semantic changes will help make a later change adding support for deopt operand bundles more streamlined. Reviewers: reames, swaroop.sridhar Subscribers: sanjoy, llvm-commits Differential Revision: http://reviews.llvm.org/D13491 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@249779 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/IR/Statepoint.h b/include/llvm/IR/Statepoint.h index 4ab1f8497ad..efe58e3e5a1 100644 --- a/include/llvm/IR/Statepoint.h +++ b/include/llvm/IR/Statepoint.h @@ -235,6 +235,10 @@ public: return getCallSite().arg_end(); } + unsigned gcArgsStartIdx() const { + return gc_args_begin() - getInstruction()->op_begin(); + } + /// range adapter for gc arguments iterator_range gc_args() const { return iterator_range(gc_args_begin(), gc_args_end()); diff --git a/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp b/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp index ed097003e31..8107d0bd18f 100644 --- a/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp +++ b/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp @@ -1339,10 +1339,6 @@ makeStatepointExplicitImpl(const CallSite CS, /* to replace */ assert(isStatepoint(CS) && "This method expects to be rewriting a statepoint"); - // We're not changing the function signature of the statepoint since the gc - // arguments go into the var args section. - Function *GCStatepointDecl = CS.getCalledFunction(); - // Then go ahead and use the builder do actually do the inserts. We insert // immediately before the previous instruction under the assumption that all // arguments will be available here. We can't insert afterwards since we may @@ -1350,24 +1346,28 @@ makeStatepointExplicitImpl(const CallSite CS, /* to replace */ Instruction *InsertBefore = CS.getInstruction(); IRBuilder<> Builder(InsertBefore); - // Copy all of the arguments from the original statepoint - this includes the - // target, call args, and deopt args - SmallVector Args; - Args.insert(Args.end(), CS.arg_begin(), CS.arg_end()); - // TODO: Clear the 'needs rewrite' flag + Statepoint OldSP(CS); + + ArrayRef GCArgs(LiveVariables); + uint64_t StatepointID = OldSP.getID(); + uint32_t NumPatchBytes = OldSP.getNumPatchBytes(); + uint32_t Flags = OldSP.getFlags(); - // Add all the pointers to be relocated (gc arguments) and capture the start - // of the live variable list for use in the gc_relocates - const int LiveStartIdx = Args.size(); - Args.insert(Args.end(), LiveVariables.begin(), LiveVariables.end()); + ArrayRef CallArgs(OldSP.arg_begin(), OldSP.arg_end()); + ArrayRef DeoptArgs(OldSP.vm_state_begin(), OldSP.vm_state_end()); + ArrayRef TransitionArgs(OldSP.gc_transition_args_begin(), + OldSP.gc_transition_args_end()); + Value *CallTarget = OldSP.getCalledValue(); // Create the statepoint given all the arguments Instruction *Token = nullptr; AttributeSet ReturnAttrs; if (CS.isCall()) { CallInst *ToReplace = cast(CS.getInstruction()); - CallInst *Call = - Builder.CreateCall(GCStatepointDecl, Args, "safepoint_token"); + CallInst *Call = Builder.CreateGCStatepointCall( + StatepointID, NumPatchBytes, CallTarget, Flags, CallArgs, + TransitionArgs, DeoptArgs, GCArgs, "safepoint_token"); + Call->setTailCall(ToReplace->isTailCall()); Call->setCallingConv(ToReplace->getCallingConv()); @@ -1392,10 +1392,11 @@ makeStatepointExplicitImpl(const CallSite CS, /* to replace */ // Insert the new invoke into the old block. We'll remove the old one in a // moment at which point this will become the new terminator for the // original block. - InvokeInst *Invoke = - InvokeInst::Create(GCStatepointDecl, ToReplace->getNormalDest(), - ToReplace->getUnwindDest(), Args, "statepoint_token", - ToReplace->getParent()); + InvokeInst *Invoke = Builder.CreateGCStatepointInvoke( + StatepointID, NumPatchBytes, CallTarget, ToReplace->getNormalDest(), + ToReplace->getUnwindDest(), Flags, CallArgs, TransitionArgs, DeoptArgs, + GCArgs, "statepoint_token"); + Invoke->setCallingConv(ToReplace->getCallingConv()); // Currently we will fail on parameter attributes and on certain @@ -1424,6 +1425,7 @@ makeStatepointExplicitImpl(const CallSite CS, /* to replace */ UnwindBlock->getLandingPadInst(), 1, "relocate_token")); Result.UnwindToken = ExceptionalToken; + const unsigned LiveStartIdx = Statepoint(Token).gcArgsStartIdx(); CreateGCRelocates(LiveVariables, LiveStartIdx, BasePtrs, ExceptionalToken, Builder); @@ -1460,6 +1462,7 @@ makeStatepointExplicitImpl(const CallSite CS, /* to replace */ Result.StatepointToken = Token; // Second, create a gc.relocate for every live variable + const unsigned LiveStartIdx = Statepoint(Token).gcArgsStartIdx(); CreateGCRelocates(LiveVariables, LiveStartIdx, BasePtrs, Token, Builder); } diff --git a/test/Transforms/RewriteStatepointsForGC/relocation.ll b/test/Transforms/RewriteStatepointsForGC/relocation.ll index 10ee08c25a4..54833b36dc8 100644 --- a/test/Transforms/RewriteStatepointsForGC/relocation.ll +++ b/test/Transforms/RewriteStatepointsForGC/relocation.ll @@ -94,7 +94,7 @@ join: ; CHECK-LABEL: join: ; CHECK: phi i8 addrspace(1)* ; CHECK-DAG: [ %arg.relocated, %if_branch ] -; CHECK-DAG: [ %arg.relocated4, %else_branch ] +; CHECK-DAG: [ %arg.relocated3, %else_branch ] ; CHECK-NOT: phi call void (i8 addrspace(1)*) @some_call(i8 addrspace(1)* %arg) ret void