[RS4GC] Refactoring to make a later change easier, NFCI
authorSanjoy Das <sanjoy@playingwithpointers.com>
Thu, 8 Oct 2015 23:18:38 +0000 (23:18 +0000)
committerSanjoy Das <sanjoy@playingwithpointers.com>
Thu, 8 Oct 2015 23:18:38 +0000 (23:18 +0000)
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

include/llvm/IR/Statepoint.h
lib/Transforms/Scalar/RewriteStatepointsForGC.cpp
test/Transforms/RewriteStatepointsForGC/relocation.ll

index 4ab1f8497adb619cc357edeaf92da423a5378f89..efe58e3e5a152b5166bf9081044293f1889df372 100644 (file)
@@ -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<arg_iterator> gc_args() const {
     return iterator_range<arg_iterator>(gc_args_begin(), gc_args_end());
index ed097003e3156d92cc9ad2abe52f89a8bb25b74f..8107d0bd18fac03a6aeac1d50c5e0ba73f127bb4 100644 (file)
@@ -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<llvm::Value *, 64> Args;
-  Args.insert(Args.end(), CS.arg_begin(), CS.arg_end());
-  // TODO: Clear the 'needs rewrite' flag
+  Statepoint OldSP(CS);
+
+  ArrayRef<Value *> 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<Use> CallArgs(OldSP.arg_begin(), OldSP.arg_end());
+  ArrayRef<Use> DeoptArgs(OldSP.vm_state_begin(), OldSP.vm_state_end());
+  ArrayRef<Use> 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<CallInst>(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);
 }
 
index 10ee08c25a4a5aee4446f429527cb720702a59d0..54833b36dc8fb9a7d37df7a194694f6cd590129b 100644 (file)
@@ -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