aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp')
-rw-r--r--contrib/llvm-project/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp75
1 files changed, 21 insertions, 54 deletions
diff --git a/contrib/llvm-project/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp b/contrib/llvm-project/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp
index c5c093ae228f..57bfe344dbab 100644
--- a/contrib/llvm-project/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp
+++ b/contrib/llvm-project/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp
@@ -14,8 +14,6 @@
#include "StatepointLowering.h"
#include "SelectionDAGBuilder.h"
#include "llvm/ADT/ArrayRef.h"
-#include "llvm/ADT/None.h"
-#include "llvm/ADT/Optional.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/SmallBitVector.h"
@@ -160,12 +158,12 @@ StatepointLoweringState::allocateStackSlot(EVT ValueType,
/// Utility function for reservePreviousStackSlotForValue. Tries to find
/// stack slot index to which we have spilled value for previous statepoints.
/// LookUpDepth specifies maximum DFS depth this function is allowed to look.
-static Optional<int> findPreviousSpillSlot(const Value *Val,
- SelectionDAGBuilder &Builder,
- int LookUpDepth) {
+static std::optional<int> findPreviousSpillSlot(const Value *Val,
+ SelectionDAGBuilder &Builder,
+ int LookUpDepth) {
// Can not look any further - give up now
if (LookUpDepth <= 0)
- return None;
+ return std::nullopt;
// Spill location is known for gc relocates
if (const auto *Relocate = dyn_cast<GCRelocateInst>(Val)) {
@@ -173,18 +171,18 @@ static Optional<int> findPreviousSpillSlot(const Value *Val,
assert((isa<GCStatepointInst>(Statepoint) || isa<UndefValue>(Statepoint)) &&
"GetStatepoint must return one of two types");
if (isa<UndefValue>(Statepoint))
- return None;
+ return std::nullopt;
const auto &RelocationMap = Builder.FuncInfo.StatepointRelocationMaps
[cast<GCStatepointInst>(Statepoint)];
auto It = RelocationMap.find(Relocate);
if (It == RelocationMap.end())
- return None;
+ return std::nullopt;
auto &Record = It->second;
if (Record.type != RecordType::Spill)
- return None;
+ return std::nullopt;
return Record.payload.FI;
}
@@ -197,16 +195,16 @@ static Optional<int> findPreviousSpillSlot(const Value *Val,
// All incoming values should have same known stack slot, otherwise result
// is unknown.
if (const PHINode *Phi = dyn_cast<PHINode>(Val)) {
- Optional<int> MergedResult = None;
+ std::optional<int> MergedResult;
for (const auto &IncomingValue : Phi->incoming_values()) {
- Optional<int> SpillSlot =
+ std::optional<int> SpillSlot =
findPreviousSpillSlot(IncomingValue, Builder, LookUpDepth - 1);
if (!SpillSlot)
- return None;
+ return std::nullopt;
if (MergedResult && *MergedResult != *SpillSlot)
- return None;
+ return std::nullopt;
MergedResult = SpillSlot;
}
@@ -241,7 +239,7 @@ static Optional<int> findPreviousSpillSlot(const Value *Val,
// which we visit values is unspecified.
// Don't know any information about this instruction
- return None;
+ return std::nullopt;
}
/// Return true if-and-only-if the given SDValue can be lowered as either a
@@ -284,7 +282,7 @@ static void reservePreviousStackSlotForValue(const Value *IncomingValue,
return;
const int LookUpDepth = 6;
- Optional<int> Index =
+ std::optional<int> Index =
findPreviousSpillSlot(IncomingValue, Builder, LookUpDepth);
if (!Index)
return;
@@ -321,7 +319,7 @@ static void reservePreviousStackSlotForValue(const Value *IncomingValue,
/// reference lowered call result
static std::pair<SDValue, SDNode *> lowerCallFromStatepointLoweringInfo(
SelectionDAGBuilder::StatepointLoweringInfo &SI,
- SelectionDAGBuilder &Builder, SmallVectorImpl<SDValue> &PendingExports) {
+ SelectionDAGBuilder &Builder) {
SDValue ReturnValue, CallEndVal;
std::tie(ReturnValue, CallEndVal) =
Builder.lowerInvokable(SI.CLI, SI.EHPadBB);
@@ -526,34 +524,6 @@ lowerStatepointMetaArgs(SmallVectorImpl<SDValue> &Ops,
SelectionDAGBuilder &Builder) {
// Lower the deopt and gc arguments for this statepoint. Layout will be:
// deopt argument length, deopt arguments.., gc arguments...
-#ifndef NDEBUG
- if (auto *GFI = Builder.GFI) {
- // Check that each of the gc pointer and bases we've gotten out of the
- // safepoint is something the strategy thinks might be a pointer (or vector
- // of pointers) into the GC heap. This is basically just here to help catch
- // errors during statepoint insertion. TODO: This should actually be in the
- // Verifier, but we can't get to the GCStrategy from there (yet).
- GCStrategy &S = GFI->getStrategy();
- for (const Value *V : SI.Bases) {
- auto Opt = S.isGCManagedPointer(V->getType()->getScalarType());
- if (Opt) {
- assert(Opt.value() &&
- "non gc managed base pointer found in statepoint");
- }
- }
- for (const Value *V : SI.Ptrs) {
- auto Opt = S.isGCManagedPointer(V->getType()->getScalarType());
- if (Opt) {
- assert(Opt.value() &&
- "non gc managed derived pointer found in statepoint");
- }
- }
- assert(SI.Bases.size() == SI.Ptrs.size() && "Pointer without base!");
- } else {
- assert(SI.Bases.empty() && "No gc specified, so cannot relocate pointers!");
- assert(SI.Ptrs.empty() && "No gc specified, so cannot relocate pointers!");
- }
-#endif
// Figure out what lowering strategy we're going to use for each part
// Note: Is is conservatively correct to lower both "live-in" and "live-out"
@@ -742,7 +712,9 @@ SDValue SelectionDAGBuilder::LowerAsSTATEPOINT(
NumOfStatepoints++;
// Clear state
StatepointLowering.startNewStatepoint(*this);
- assert(SI.Bases.size() == SI.Ptrs.size());
+ assert(SI.Bases.size() == SI.Ptrs.size() && "Pointer without base!");
+ assert((GFI || SI.Bases.empty()) &&
+ "No gc specified, so cannot relocate pointers!");
LLVM_DEBUG(dbgs() << "Lowering statepoint " << *SI.StatepointInstr << "\n");
#ifndef NDEBUG
@@ -770,8 +742,7 @@ SDValue SelectionDAGBuilder::LowerAsSTATEPOINT(
// Get call node, we will replace it later with statepoint
SDValue ReturnVal;
SDNode *CallNode;
- std::tie(ReturnVal, CallNode) =
- lowerCallFromStatepointLoweringInfo(SI, *this, PendingExports);
+ std::tie(ReturnVal, CallNode) = lowerCallFromStatepointLoweringInfo(SI, *this);
// Construct the actual GC_TRANSITION_START, STATEPOINT, and GC_TRANSITION_END
// nodes with all the appropriate arguments and return values.
@@ -921,7 +892,7 @@ SDValue SelectionDAGBuilder::LowerAsSTATEPOINT(
auto *RetTy = Relocate->getType();
Register Reg = FuncInfo.CreateRegs(RetTy);
RegsForValue RFV(*DAG.getContext(), DAG.getTargetLoweringInfo(),
- DAG.getDataLayout(), Reg, RetTy, None);
+ DAG.getDataLayout(), Reg, RetTy, std::nullopt);
SDValue Chain = DAG.getRoot();
RFV.getCopyToRegs(Relocated, DAG, getCurSDLoc(), Chain, nullptr);
PendingExports.push_back(Chain);
@@ -1148,7 +1119,7 @@ SelectionDAGBuilder::LowerStatepoint(const GCStatepointInst &I,
// TODO: To eliminate this problem we can remove gc.result intrinsics
// completely and make statepoint call to return a tuple.
Type *RetTy = GCResultLocality.second->getType();
- unsigned Reg = FuncInfo.CreateRegs(RetTy);
+ Register Reg = FuncInfo.CreateRegs(RetTy);
RegsForValue RFV(*DAG.getContext(), DAG.getTargetLoweringInfo(),
DAG.getDataLayout(), Reg, RetTy,
I.getCallingConv());
@@ -1239,10 +1210,6 @@ void SelectionDAGBuilder::visitGCRelocate(const GCRelocateInst &Relocate) {
if (cast<GCStatepointInst>(Statepoint)->getParent() == Relocate.getParent())
StatepointLowering.relocCallVisited(Relocate);
-
- auto *Ty = Relocate.getType()->getScalarType();
- if (auto IsManaged = GFI->getStrategy().isGCManagedPointer(Ty))
- assert(*IsManaged && "Non gc managed pointer relocated!");
#endif
const Value *DerivedPtr = Relocate.getDerivedPtr();
@@ -1266,7 +1233,7 @@ void SelectionDAGBuilder::visitGCRelocate(const GCRelocateInst &Relocate) {
Register InReg = Record.payload.Reg;
RegsForValue RFV(*DAG.getContext(), DAG.getTargetLoweringInfo(),
DAG.getDataLayout(), InReg, Relocate.getType(),
- None); // This is not an ABI copy.
+ std::nullopt); // This is not an ABI copy.
// We generate copy to/from regs even for local uses, hence we must
// chain with current root to ensure proper ordering of copies w.r.t.
// statepoint.