summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/IR/Statepoint.h4
-rw-r--r--llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp41
-rw-r--r--llvm/test/Transforms/RewriteStatepointsForGC/relocation.ll2
3 files changed, 27 insertions, 20 deletions
diff --git a/llvm/include/llvm/IR/Statepoint.h b/llvm/include/llvm/IR/Statepoint.h
index 4ab1f8497ad..efe58e3e5a1 100644
--- a/llvm/include/llvm/IR/Statepoint.h
+++ b/llvm/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<arg_iterator> gc_args() const {
return iterator_range<arg_iterator>(gc_args_begin(), gc_args_end());
diff --git a/llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp b/llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp
index ed097003e31..8107d0bd18f 100644
--- a/llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp
+++ b/llvm/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<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);
}
diff --git a/llvm/test/Transforms/RewriteStatepointsForGC/relocation.ll b/llvm/test/Transforms/RewriteStatepointsForGC/relocation.ll
index 10ee08c25a4..54833b36dc8 100644
--- a/llvm/test/Transforms/RewriteStatepointsForGC/relocation.ll
+++ b/llvm/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
OpenPOWER on IntegriCloud