Files
swift-mirror/lib/SILOptimizer/Utils/PartitionUtils.cpp
Michael Gottesman e00fbfa6b6 [region-isolation] Refactor RegionAnalysis AST pattern matching onto a helper factory method on IsolationRegionInfo.
Long term I would like to get region analysis and transfer non sendable out of
the business of directly interpreting the AST... but if we have to do it now, I
would rather us do it through a helper struct. At least the helper struct can be
modified later to work with additional SIL concurrency support when it is added.
2024-03-21 14:16:20 -07:00

68 lines
2.5 KiB
C++

//===--- PartitionUtils.cpp -----------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2023 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
#include "swift/SILOptimizer/Utils/PartitionUtils.h"
#include "swift/AST/Expr.h"
#include "swift/SIL/ApplySite.h"
#include "llvm/Support/CommandLine.h"
using namespace swift;
//===----------------------------------------------------------------------===//
// MARK: Logging
//===----------------------------------------------------------------------===//
#ifndef NDEBUG
bool swift::PartitionPrimitives::REGIONBASEDISOLATION_ENABLE_VERBOSE_LOGGING;
static llvm::cl::opt<bool, true> // The parser
RegionBasedIsolationVerboseLog(
"sil-regionbasedisolation-verbose-log",
llvm::cl::desc("Enable verbose logging for SIL region based isolation "
"diagnostics"),
llvm::cl::Hidden,
llvm::cl::location(swift::PartitionPrimitives::
REGIONBASEDISOLATION_ENABLE_VERBOSE_LOGGING));
#endif
//===----------------------------------------------------------------------===//
// MARK: IsolationRegionInfo
//===----------------------------------------------------------------------===//
IsolationRegionInfo IsolationRegionInfo::get(SILInstruction *inst) {
if (ApplyExpr *apply = inst->getLoc().getAsASTNode<ApplyExpr>())
if (auto crossing = apply->getIsolationCrossing())
return IsolationRegionInfo::getActorIsolated(
crossing->getCalleeIsolation());
if (auto fas = FullApplySite::isa(inst)) {
if (auto crossing = fas.getIsolationCrossing())
return IsolationRegionInfo::getActorIsolated(
crossing->getCalleeIsolation());
}
if (auto *pai = dyn_cast<PartialApplyInst>(inst)) {
if (auto *ace = pai->getLoc().getAsASTNode<AbstractClosureExpr>()) {
auto actorIsolation = ace->getActorIsolation();
if (actorIsolation.isActorIsolated()) {
return IsolationRegionInfo::getActorIsolated(actorIsolation);
}
}
}
// We assume that any instruction that does not correspond to an ApplyExpr
// cannot cross an isolation domain.
return IsolationRegionInfo();
}