[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