Skip to content

Commit be02038

Browse files
committed
SILOptimizer: Implement .sil test for switch optimization.
1 parent e2bb7e8 commit be02038

File tree

2 files changed

+78
-0
lines changed

2 files changed

+78
-0
lines changed

lib/DriverTool/sil_opt_main.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,21 @@ struct SILOptOptions {
499499
llvm::cl::opt<bool> DebugDiagnosticNames = llvm::cl::opt<bool>(
500500
"debug-diagnostic-names",
501501
llvm::cl::desc("Include diagnostic names when printing"));
502+
503+
llvm::cl::opt<swift::UnavailableDeclOptimization>
504+
UnavailableDeclOptimization =
505+
llvm::cl::opt<swift::UnavailableDeclOptimization>(
506+
"unavailable-decl-optimization",
507+
llvm::cl::desc("Optimization mode for unavailable declarations"),
508+
llvm::cl::values(
509+
clEnumValN(swift::UnavailableDeclOptimization::None, "none",
510+
"Don't optimize unavailable decls"),
511+
clEnumValN(swift::UnavailableDeclOptimization::Stub, "stub",
512+
"Lower unavailable functions to stubs"),
513+
clEnumValN(
514+
swift::UnavailableDeclOptimization::Complete, "complete",
515+
"Eliminate unavailable decls from lowered SIL/IR")),
516+
llvm::cl::init(swift::UnavailableDeclOptimization::None));
502517
};
503518

504519
/// Regular expression corresponding to the value given in one of the
@@ -646,6 +661,9 @@ int sil_opt_main(ArrayRef<const char *> argv, void *MainAddr) {
646661

647662
Invocation.getLangOptions().EnableCXXInterop = options.EnableCxxInterop;
648663

664+
Invocation.getLangOptions().UnavailableDeclOptimizationMode =
665+
options.UnavailableDeclOptimization;
666+
649667
Invocation.getDiagnosticOptions().VerifyMode =
650668
options.VerifyMode ? DiagnosticOptions::Verify : DiagnosticOptions::NoVerify;
651669

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// RUN: %target-sil-opt -enable-sil-verify-all -unavailable-decl-optimization=complete %s -diagnostics | %FileCheck %s
2+
3+
sil_stage raw
4+
5+
import Builtin
6+
7+
func foo()
8+
9+
enum HasUnavailableElement {
10+
case available
11+
@available(*, unavailable)
12+
case unavailable
13+
}
14+
15+
sil @foo : $@convention(thin) () -> ()
16+
17+
// CHECK-LABEL: sil @test_fully_covered_switch
18+
// CHECK: switch_enum %0 : $HasUnavailableElement, case #HasUnavailableElement.available!enumelt: [[AVAILBB:bb[0-9]+]], default [[DEFAULTBB:bb[0-9]+]]
19+
// CHECK: [[AVAILBB]]:
20+
// CHECK-NOT: function_ref @foo
21+
// CHECK: return
22+
// CHECK: [[DEFAULTBB]]:
23+
// CHECK: integer_literal $Builtin.Int1, -1
24+
// CHECK: cond_fail {{%.*}} : $Builtin.Int1, "unexpected enum value"
25+
// CHECK: unreachable
26+
27+
sil @test_fully_covered_switch : $@convention(thin) (HasUnavailableElement) -> () {
28+
bb0(%0 : $HasUnavailableElement):
29+
switch_enum %0 : $HasUnavailableElement, case #HasUnavailableElement.available!enumelt: bb1, case #HasUnavailableElement.unavailable!enumelt: bb2
30+
bb1:
31+
br bb3
32+
bb2:
33+
%1 = function_ref @foo : $@convention(thin) () -> ()
34+
%2 = apply %1() : $@convention(thin) () -> ()
35+
br bb3
36+
bb3:
37+
%5 = tuple ()
38+
return %5 : $()
39+
}
40+
41+
// CHECK-LABEL: sil @test_available_element_skipped_switch
42+
// CHECK: switch_enum %0 : $HasUnavailableElement, default [[DEFAULTBB:bb[0-9]+]]
43+
// CHECK: [[DEFAULTBB]]:
44+
// CHECK: function_ref @foo
45+
// CHECK: apply
46+
// CHECK: return
47+
48+
sil @test_available_element_skipped_switch : $@convention(thin) (HasUnavailableElement) -> () {
49+
bb0(%0 : $HasUnavailableElement):
50+
switch_enum %0 : $HasUnavailableElement, case #HasUnavailableElement.unavailable!enumelt: bb1, default bb2
51+
bb1:
52+
br bb3
53+
bb2:
54+
%4 = function_ref @foo : $@convention(thin) () -> ()
55+
%5 = apply %4() : $@convention(thin) () -> ()
56+
br bb3
57+
bb3:
58+
%7 = tuple ()
59+
return %7 : $()
60+
}

0 commit comments

Comments
 (0)