[llvm] 9d06547 - [Statepoints] Sink routines for grabbing projections to GCStatepointInst [NFC]
Philip Reames via llvm-commits
llvm-commits at lists.llvm.org
Thu May 28 13:52:16 PDT 2020
Author: Philip Reames
Date: 2020-05-28T13:51:59-07:00
New Revision: 9d065477942ffa6d9085188c0d1d2cb95a41baf6
URL: https://github.com/llvm/llvm-project/commit/9d065477942ffa6d9085188c0d1d2cb95a41baf6
DIFF: https://github.com/llvm/llvm-project/commit/9d065477942ffa6d9085188c0d1d2cb95a41baf6.diff
LOG: [Statepoints] Sink routines for grabbing projections to GCStatepointInst [NFC]
Mechanical movement, nothing more.
Added:
Modified:
llvm/include/llvm/IR/Statepoint.h
llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/IR/Statepoint.h b/llvm/include/llvm/IR/Statepoint.h
index 81679e2612da..d31484207c10 100644
--- a/llvm/include/llvm/IR/Statepoint.h
+++ b/llvm/include/llvm/IR/Statepoint.h
@@ -181,6 +181,23 @@ class GCStatepointInst : public CallBase {
iterator_range<const_op_iterator> gc_args() const {
return make_range(gc_args_begin(), gc_args_end());
}
+
+
+ /// Get list of all gc reloactes linked to this statepoint
+ /// May contain several relocations for the same base/derived pair.
+ /// For example this could happen due to relocations on unwinding
+ /// path of invoke.
+ inline std::vector<const GCRelocateInst *> getGCRelocates() const;
+
+ /// Get the experimental_gc_result call tied to this statepoint if there is
+ /// one, otherwise return nullptr.
+ const GCResultInst *getGCResult() const {
+ for (auto *U : users())
+ if (auto *GRI = dyn_cast<GCResultInst>(U))
+ return GRI;
+ return nullptr;
+ }
+
};
/// A wrapper around a GC intrinsic call, this provides most of the actual
@@ -322,20 +339,11 @@ class StatepointBase {
return getCall()->gc_args();
}
- /// Get list of all gc reloactes linked to this statepoint
- /// May contain several relocations for the same base/derived pair.
- /// For example this could happen due to relocations on unwinding
- /// path of invoke.
- std::vector<const GCRelocateInst *> getRelocates() const;
-
- /// Get the experimental_gc_result call tied to this statepoint. Can be
- /// nullptr if there isn't a gc_result tied to this statepoint. Guaranteed to
- /// be a CallInst if non-null.
+ std::vector<const GCRelocateInst *> getRelocates() const {
+ return getCall()->getGCRelocates();
+ }
const GCResultInst *getGCResult() const {
- for (auto *U : getInstruction()->users())
- if (auto *GRI = dyn_cast<GCResultInst>(U))
- return GRI;
- return nullptr;
+ return getCall()->getGCResult();
}
#ifndef NDEBUG
@@ -470,21 +478,17 @@ class GCResultInst : public GCProjectionInst {
}
};
-template <typename FunTy, typename InstructionTy, typename ValueTy,
- typename CallTy>
-std::vector<const GCRelocateInst *>
-StatepointBase<FunTy, InstructionTy, ValueTy, CallTy>::getRelocates()
- const {
+std::vector<const GCRelocateInst *> GCStatepointInst::getGCRelocates() const {
std::vector<const GCRelocateInst *> Result;
// Search for relocated pointers. Note that working backwards from the
// gc_relocates ensures that we only get pairs which are actually relocated
// and used after the statepoint.
- for (const User *U : StatepointCall->users())
+ for (const User *U : users())
if (auto *Relocate = dyn_cast<GCRelocateInst>(U))
Result.push_back(Relocate);
- auto *StatepointInvoke = dyn_cast<InvokeInst>(StatepointCall);
+ auto *StatepointInvoke = dyn_cast<InvokeInst>(this);
if (!StatepointInvoke)
return Result;
diff --git a/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp
index 4f51efd09472..3e8911859e2d 100644
--- a/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp
@@ -854,7 +854,7 @@ SelectionDAGBuilder::LowerStatepoint(const GCStatepointInst &I,
// separately with half the space. This would require a format rev and a
// fairly major rework of the STATEPOINT node though.
SmallSet<SDValue, 8> Seen;
- for (const GCRelocateInst *Relocate : ISP.getRelocates()) {
+ for (const GCRelocateInst *Relocate : I.getGCRelocates()) {
SI.GCRelocates.push_back(Relocate);
SDValue DerivedSD = getValue(Relocate->getDerivedPtr());
@@ -893,7 +893,7 @@ SelectionDAGBuilder::LowerStatepoint(const GCStatepointInst &I,
SDValue ReturnValue = LowerAsSTATEPOINT(SI);
// Export the result value if needed
- const GCResultInst *GCResult = ISP.getGCResult();
+ const GCResultInst *GCResult = I.getGCResult();
Type *RetTy = I.getActualReturnType();
if (!RetTy->isVoidTy() && GCResult) {
if (GCResult->getParent() != I.getParent()) {
More information about the llvm-commits
mailing list