Skip to content

Commit 78d74cf

Browse files
committed
[region-isolation] Make sil-region-isolation-assert-on-unknown-pattern also work with TransferNonSendable versions of the error.
This asserts only option is an option to make it quicker/easier to triage unknown pattern match errors by aborting when we emit it (allowing one to immediately drop into the debugger at that point). Previously, it only happened for errors in RegionAnalysis not in TransferNonSendable itself.
1 parent 465634c commit 78d74cf

File tree

3 files changed

+36
-2
lines changed

3 files changed

+36
-2
lines changed

include/swift/SILOptimizer/Analysis/RegionAnalysis.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,12 @@ class RegionAnalysisValueMap;
2828

2929
namespace regionanalysisimpl {
3030

31+
#ifndef NDEBUG
32+
/// Global bool set only when asserts are enabled to ease debugging by causing
33+
/// unknown pattern errors to cause an assert so we drop into the debugger.
34+
extern bool AbortOnUnknownPatternMatchError;
35+
#endif
36+
3137
using TransferringOperandSetFactory = Partition::TransferringOperandSetFactory;
3238
using Element = PartitionPrimitives::Element;
3339
using Region = PartitionPrimitives::Region;

lib/SILOptimizer/Analysis/RegionAnalysis.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,19 @@ using namespace swift::PartitionPrimitives;
4848
using namespace swift::PatternMatch;
4949
using namespace swift::regionanalysisimpl;
5050

51-
static llvm::cl::opt<bool> AbortOnUnknownPatternMatchError(
51+
#ifndef NDEBUG
52+
53+
bool swift::regionanalysisimpl::AbortOnUnknownPatternMatchError = false;
54+
55+
static llvm::cl::opt<bool, true> AbortOnUnknownPatternMatchErrorCmdLine(
5256
"sil-region-isolation-assert-on-unknown-pattern",
5357
llvm::cl::desc("Abort if SIL region isolation detects an unknown pattern. "
5458
"Intended only to be used when debugging the compiler!"),
55-
llvm::cl::init(false), llvm::cl::Hidden);
59+
llvm::cl::Hidden,
60+
llvm::cl::location(
61+
swift::regionanalysisimpl::AbortOnUnknownPatternMatchError));
62+
63+
#endif
5664

5765
//===----------------------------------------------------------------------===//
5866
// MARK: Utilities

lib/SILOptimizer/Mandatory/TransferNonSendable.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -665,6 +665,11 @@ class UseAfterTransferDiagnosticEmitter {
665665
}
666666

667667
void emitUnknownPatternError() {
668+
if (AbortOnUnknownPatternMatchError) {
669+
llvm::report_fatal_error(
670+
"RegionIsolation: Aborting on unknown pattern match error");
671+
}
672+
668673
diagnoseError(transferOp->getUser(),
669674
diag::regionbasedisolation_unknown_pattern)
670675
.limitBehaviorIf(getBehaviorLimit());
@@ -1059,6 +1064,11 @@ void TransferNonSendableImpl::emitUseAfterTransferDiagnostics() {
10591064
// tells the user to file a bug. This importantly ensures that we can
10601065
// guarantee that we always find the require if we successfully compile.
10611066
if (!didEmitRequireNote) {
1067+
if (AbortOnUnknownPatternMatchError) {
1068+
llvm::report_fatal_error(
1069+
"RegionIsolation: Aborting on unknown pattern match error");
1070+
}
1071+
10621072
diagnoseError(transferOp, diag::regionbasedisolation_unknown_pattern);
10631073
continue;
10641074
}
@@ -1117,6 +1127,11 @@ class TransferNonTransferrableDiagnosticEmitter {
11171127
}
11181128

11191129
void emitUnknownPatternError() {
1130+
if (AbortOnUnknownPatternMatchError) {
1131+
llvm::report_fatal_error(
1132+
"RegionIsolation: Aborting on unknown pattern match error");
1133+
}
1134+
11201135
diagnoseError(getOperand()->getUser(),
11211136
diag::regionbasedisolation_unknown_pattern)
11221137
.limitBehaviorIf(getBehaviorLimit());
@@ -1602,6 +1617,11 @@ struct DiagnosticEvaluator final
16021617
}
16031618

16041619
void handleUnknownCodePattern(const PartitionOp &op) const {
1620+
if (AbortOnUnknownPatternMatchError) {
1621+
llvm::report_fatal_error(
1622+
"RegionIsolation: Aborting on unknown pattern match error");
1623+
}
1624+
16051625
diagnoseError(op.getSourceInst(),
16061626
diag::regionbasedisolation_unknown_pattern);
16071627
}

0 commit comments

Comments
 (0)