Skip to content

Commit f126023

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. (cherry picked from commit 78d74cf)
1 parent 05ffb67 commit f126023

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
@@ -47,11 +47,19 @@ using namespace swift::PartitionPrimitives;
4747
using namespace swift::PatternMatch;
4848
using namespace swift::regionanalysisimpl;
4949

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

5664
//===----------------------------------------------------------------------===//
5765
// MARK: Utilities

lib/SILOptimizer/Mandatory/TransferNonSendable.cpp

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

666666
void emitUnknownPatternError() {
667+
if (AbortOnUnknownPatternMatchError) {
668+
llvm::report_fatal_error(
669+
"RegionIsolation: Aborting on unknown pattern match error");
670+
}
671+
667672
diagnoseError(transferOp->getUser(),
668673
diag::regionbasedisolation_unknown_pattern)
669674
.limitBehaviorIf(getBehaviorLimit());
@@ -1058,6 +1063,11 @@ void TransferNonSendableImpl::emitUseAfterTransferDiagnostics() {
10581063
// tells the user to file a bug. This importantly ensures that we can
10591064
// guarantee that we always find the require if we successfully compile.
10601065
if (!didEmitRequireNote) {
1066+
if (AbortOnUnknownPatternMatchError) {
1067+
llvm::report_fatal_error(
1068+
"RegionIsolation: Aborting on unknown pattern match error");
1069+
}
1070+
10611071
diagnoseError(transferOp, diag::regionbasedisolation_unknown_pattern);
10621072
continue;
10631073
}
@@ -1116,6 +1126,11 @@ class TransferNonTransferrableDiagnosticEmitter {
11161126
}
11171127

11181128
void emitUnknownPatternError() {
1129+
if (AbortOnUnknownPatternMatchError) {
1130+
llvm::report_fatal_error(
1131+
"RegionIsolation: Aborting on unknown pattern match error");
1132+
}
1133+
11191134
diagnoseError(getOperand()->getUser(),
11201135
diag::regionbasedisolation_unknown_pattern)
11211136
.limitBehaviorIf(getBehaviorLimit());
@@ -1601,6 +1616,11 @@ struct DiagnosticEvaluator final
16011616
}
16021617

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

0 commit comments

Comments
 (0)