Skip to content

Commit 8eb14fc

Browse files
authored
Merge pull request #37895 from gottesmm/assembly-vision-rebrand
[assembly-vision] Finish rebranding of opt remark gen to Assembly Vision Remark and add @_assemblyVision Attr
2 parents 38a8b00 + 3fdb0fd commit 8eb14fc

File tree

16 files changed

+93
-65
lines changed

16 files changed

+93
-65
lines changed

include/swift/AST/Attr.def

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -672,6 +672,11 @@ SIMPLE_DECL_ATTR(_distributedActorIndependent, DistributedActorIndependent,
672672
APIBreakingToAdd | APIBreakingToRemove,
673673
119)
674674

675+
SIMPLE_DECL_ATTR(_assemblyVision, EmitAssemblyVisionRemarks,
676+
OnFunc | UserInaccessible | NotSerialized |
677+
ABIStableToAdd | ABIStableToRemove | APIStableToAdd | APIStableToRemove,
678+
120)
679+
675680
#undef TYPE_ATTR
676681
#undef DECL_ATTR_ALIAS
677682
#undef CONTEXTUAL_DECL_ATTR_ALIAS

include/swift/SILOptimizer/PassManager/Passes.def

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -415,8 +415,8 @@ PASS(OptimizedMandatoryCombine, "optimized-mandatory-combine",
415415
"Perform -O level mandatory peephole combines")
416416
PASS(BugReducerTester, "bug-reducer-tester",
417417
"sil-bug-reducer Tool Testing by Asserting on a Sentinel Function")
418-
PASS(OptRemarkGenerator, "sil-opt-remark-generator",
419-
"Emit small peephole opt remarks that do not use large analyses")
418+
PASS(AssemblyVisionRemarkGenerator, "assembly-vision-remark-generator",
419+
"Emit assembly vision remarks that provide source level guidance of where runtime calls ended up")
420420
PASS(PruneVTables, "prune-vtables",
421421
"Mark class methods that do not require vtable dispatch")
422422
PASS_RANGE(AllPasses, AADumper, PruneVTables)

lib/SIL/IR/SILFunctionBuilder.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,11 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
#include "swift/SIL/SILFunctionBuilder.h"
14+
#include "swift/AST/AttrKind.h"
1415
#include "swift/AST/Availability.h"
1516
#include "swift/AST/Decl.h"
17+
#include "swift/AST/SemanticAttrs.h"
18+
1619
using namespace swift;
1720

1821
SILFunction *SILFunctionBuilder::getOrCreateFunction(
@@ -45,6 +48,13 @@ void SILFunctionBuilder::addFunctionAttributes(
4548
for (auto *A : Attrs.getAttributes<SemanticsAttr>())
4649
F->addSemanticsAttr(cast<SemanticsAttr>(A)->Value);
4750

51+
// If we are asked to emit assembly vision remarks for this function, mark the
52+
// function as force emitting all optremarks including assembly vision
53+
// remarks. This allows us to emit the assembly vision remarks without needing
54+
// to change any of the underlying optremark mechanisms.
55+
if (auto *A = Attrs.getAttribute(DAK_EmitAssemblyVisionRemarks))
56+
F->addSemanticsAttr(semantics::FORCE_EMIT_OPT_REMARK_PREFIX);
57+
4858
// Propagate @_specialize.
4959
for (auto *A : Attrs.getAttributes<SpecializeAttr>()) {
5060
auto *SA = cast<SpecializeAttr>(A);

lib/SILOptimizer/PassManager/PassPipeline.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -728,8 +728,8 @@ static void addLastChanceOptPassPipeline(SILPassPipelinePlan &P) {
728728
// Only has an effect if the -assume-single-thread option is specified.
729729
P.addAssumeSingleThreaded();
730730

731-
// Only has an effect if opt-remark is enabled.
732-
P.addOptRemarkGenerator();
731+
// Emits remarks on all functions with @_assemblyVision attribute.
732+
P.addAssemblyVisionRemarkGenerator();
733733

734734
// FIXME: rdar://72935649 (Miscompile on combining PruneVTables with WMO)
735735
// P.addPruneVTables();

lib/SILOptimizer/Transforms/OptRemarkGenerator.cpp renamed to lib/SILOptimizer/Transforms/AssemblyVisionRemarkGenerator.cpp

Lines changed: 41 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
//===--- OptRemarkGenerator.cpp -------------------------------------------===//
1+
//===--- AssemblyVisionRemarkGenerator.cpp --------------------------------===//
22
//
33
// This source file is part of the Swift.org open source project
44
//
5-
// Copyright (c) 2014 - 2020 Apple Inc. and the Swift project authors
5+
// Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors
66
// Licensed under Apache License v2.0 with Runtime Library Exception
77
//
88
// See https://swift.org/LICENSE.txt for license information
@@ -12,23 +12,23 @@
1212
///
1313
/// \file
1414
///
15-
/// In this pass, we define the opt-remark-generator, a simple SILVisitor that
16-
/// attempts to infer opt-remarks for the user using heuristics.
15+
/// In this pass, we define the assembly-vision-remark-generator, a simple
16+
/// SILVisitor that attempts to infer remarks for the user using heuristics.
1717
///
1818
//===----------------------------------------------------------------------===//
1919

20-
#define DEBUG_TYPE "sil-opt-remark-gen"
20+
#define DEBUG_TYPE "sil-assembly-vision-remark-gen"
2121

2222
#include "swift/AST/SemanticAttrs.h"
2323
#include "swift/Basic/Defer.h"
2424
#include "swift/SIL/DebugUtils.h"
2525
#include "swift/SIL/DynamicCasts.h"
2626
#include "swift/SIL/MemAccessUtils.h"
2727
#include "swift/SIL/OptimizationRemark.h"
28+
#include "swift/SIL/PatternMatch.h"
2829
#include "swift/SIL/Projection.h"
2930
#include "swift/SIL/SILFunction.h"
3031
#include "swift/SIL/SILInstruction.h"
31-
#include "swift/SIL/PatternMatch.h"
3232
#include "swift/SIL/SILModule.h"
3333
#include "swift/SIL/SILVisitor.h"
3434
#include "swift/SILOptimizer/Analysis/RCIdentityAnalysis.h"
@@ -41,13 +41,14 @@ using namespace swift;
4141
using namespace swift::PatternMatch;
4242

4343
static llvm::cl::opt<bool> ForceVisitImplicitAutogeneratedFunctions(
44-
"optremarkgen-visit-implicit-autogen-funcs", llvm::cl::Hidden,
44+
"assemblyvisionremarkgen-visit-implicit-autogen-funcs", llvm::cl::Hidden,
4545
llvm::cl::desc(
4646
"Emit opt remarks even on implicit and autogenerated functions"),
4747
llvm::cl::init(false));
4848

4949
static llvm::cl::opt<bool> DecllessDebugValueUseSILDebugInfo(
50-
"optremarkgen-declless-debugvalue-use-sildebugvar-info", llvm::cl::Hidden,
50+
"assemblyvisionremarkgen-declless-debugvalue-use-sildebugvar-info",
51+
llvm::cl::Hidden,
5152
llvm::cl::desc(
5253
"If a debug_value does not have a decl, infer a value with a name from "
5354
"that info that has a loc set to the loc of the debug_value "
@@ -98,7 +99,8 @@ struct ValueToDeclInferrer {
9899
///
99100
/// sil @theFunction : $@convention(thin) () -> () {
100101
/// bb0:
101-
/// %0 = apply %getKlassPair() : $@convention(thin) () -> @owned KlassPair
102+
/// %0 = apply %getKlassPair() : $@convention(thin) () -> @owned
103+
/// KlassPair
102104
/// // This debug_value's name can be combined...
103105
/// debug_value %0 : $KlassPair, name "myPair"
104106
/// // ... with the access path from the struct_extract here...
@@ -119,8 +121,9 @@ struct ValueToDeclInferrer {
119121
/// //
120122
/// // The reason why we must do this is due to the behavior of the late
121123
/// // optimizer and how it forms these patterns in the code.
122-
/// %0a = apply %getStateWithOwningPointer() : $@convention(thin) () -> @owned StateWithOwningPointer
123-
/// %1 = struct_extract %0a : $StateWithOwningPointer, #StateWithOwningPointer.owningPtr
124+
/// %0a = apply %getStateWithOwningPointer() : $@convention(thin) () ->
125+
/// @owned StateWithOwningPointer %1 = struct_extract %0a :
126+
/// $StateWithOwningPointer, #StateWithOwningPointer.owningPtr
124127
/// strong_retain %1 : $Klass
125128
/// %2 = struct $Array(%0 : $Builtin.NativeObject, ...)
126129
/// debug_value %2 : $Array, ...
@@ -130,7 +133,8 @@ struct ValueToDeclInferrer {
130133

131134
/// Convenience overload that calls:
132135
///
133-
/// printNote(stream, decl->getBaseName().userFacingName(), shouldPrintAccessPath).
136+
/// printNote(stream, decl->getBaseName().userFacingName(),
137+
/// shouldPrintAccessPath).
134138
void printNote(llvm::raw_string_ostream &stream, const ValueDecl *decl,
135139
bool shouldPrintAccessPath = true) {
136140
printNote(stream, decl->getBaseName().userFacingName(),
@@ -308,9 +312,7 @@ bool ValueToDeclInferrer::infer(
308312
SmallVectorImpl<Argument> &resultingInferredDecls,
309313
bool allowSingleRefEltAddrPeek) {
310314
// Clear the stored access path at end of scope.
311-
SWIFT_DEFER {
312-
accessPath.clear();
313-
};
315+
SWIFT_DEFER { accessPath.clear(); };
314316
ValueUseToDeclInferrer valueUseInferrer{
315317
{}, *this, keyKind, resultingInferredDecls};
316318
bool foundSingleRefElementAddr = false;
@@ -379,8 +381,9 @@ bool ValueToDeclInferrer::infer(
379381
// A pattern that we see around empty array storage is:
380382
//
381383
// %0 = global_addr @_swiftEmptyArrayStorage : $*_SwiftEmptyArrayStorage
382-
// %1 = address_to_pointer %0 : $*_SwiftEmptyArrayStorage to $Builtin.RawPointer
383-
// %2 = raw_pointer_to_ref %1 : $Builtin.RawPointer to $__EmptyArrayStorage
384+
// %1 = address_to_pointer %0 : $*_SwiftEmptyArrayStorage to
385+
// $Builtin.RawPointer %2 = raw_pointer_to_ref %1 : $Builtin.RawPointer to
386+
// $__EmptyArrayStorage
384387
//
385388
// Recognize this case.
386389
{
@@ -490,17 +493,18 @@ bool ValueToDeclInferrer::infer(
490493

491494
namespace {
492495

493-
struct OptRemarkGeneratorInstructionVisitor
494-
: public SILInstructionVisitor<OptRemarkGeneratorInstructionVisitor> {
496+
struct AssemblyVisionRemarkGeneratorInstructionVisitor
497+
: public SILInstructionVisitor<
498+
AssemblyVisionRemarkGeneratorInstructionVisitor> {
495499
SILModule &mod;
496500
OptRemark::Emitter ORE;
497501

498502
/// A class that we use to infer the decl that is associated with a
499503
/// miscellaneous SIL value. This is just a heuristic that is to taste.
500504
ValueToDeclInferrer valueToDeclInferrer;
501505

502-
OptRemarkGeneratorInstructionVisitor(SILFunction &fn,
503-
RCIdentityFunctionInfo &rcfi)
506+
AssemblyVisionRemarkGeneratorInstructionVisitor(SILFunction &fn,
507+
RCIdentityFunctionInfo &rcfi)
504508
: mod(fn.getModule()), ORE(DEBUG_TYPE, fn), valueToDeclInferrer(rcfi) {}
505509

506510
void visitStrongRetainInst(StrongRetainInst *sri);
@@ -519,7 +523,7 @@ struct OptRemarkGeneratorInstructionVisitor
519523

520524
} // anonymous namespace
521525

522-
void OptRemarkGeneratorInstructionVisitor::
526+
void AssemblyVisionRemarkGeneratorInstructionVisitor::
523527
visitUnconditionalCheckedCastAddrInst(
524528
UnconditionalCheckedCastAddrInst *uccai) {
525529
ORE.emit([&]() {
@@ -542,8 +546,8 @@ void OptRemarkGeneratorInstructionVisitor::
542546
});
543547
}
544548

545-
void OptRemarkGeneratorInstructionVisitor::visitCheckedCastAddrBranchInst(
546-
CheckedCastAddrBranchInst *ccabi) {
549+
void AssemblyVisionRemarkGeneratorInstructionVisitor::
550+
visitCheckedCastAddrBranchInst(CheckedCastAddrBranchInst *ccabi) {
547551
ORE.emit([&]() {
548552
using namespace OptRemark;
549553
SmallVector<Argument, 8> inferredArgs;
@@ -564,7 +568,7 @@ void OptRemarkGeneratorInstructionVisitor::visitCheckedCastAddrBranchInst(
564568
});
565569
}
566570

567-
void OptRemarkGeneratorInstructionVisitor::visitBeginAccessInst(
571+
void AssemblyVisionRemarkGeneratorInstructionVisitor::visitBeginAccessInst(
568572
BeginAccessInst *bai) {
569573
ORE.emit([&]() {
570574
using namespace OptRemark;
@@ -586,7 +590,7 @@ void OptRemarkGeneratorInstructionVisitor::visitBeginAccessInst(
586590
});
587591
}
588592

589-
void OptRemarkGeneratorInstructionVisitor::visitEndAccessInst(
593+
void AssemblyVisionRemarkGeneratorInstructionVisitor::visitEndAccessInst(
590594
EndAccessInst *eai) {
591595
ORE.emit([&]() {
592596
using namespace OptRemark;
@@ -611,7 +615,7 @@ void OptRemarkGeneratorInstructionVisitor::visitEndAccessInst(
611615
});
612616
}
613617

614-
void OptRemarkGeneratorInstructionVisitor::visitStrongRetainInst(
618+
void AssemblyVisionRemarkGeneratorInstructionVisitor::visitStrongRetainInst(
615619
StrongRetainInst *sri) {
616620
ORE.emit([&]() {
617621
using namespace OptRemark;
@@ -633,7 +637,7 @@ void OptRemarkGeneratorInstructionVisitor::visitStrongRetainInst(
633637
});
634638
}
635639

636-
void OptRemarkGeneratorInstructionVisitor::visitStrongReleaseInst(
640+
void AssemblyVisionRemarkGeneratorInstructionVisitor::visitStrongReleaseInst(
637641
StrongReleaseInst *sri) {
638642
ORE.emit([&]() {
639643
using namespace OptRemark;
@@ -656,7 +660,7 @@ void OptRemarkGeneratorInstructionVisitor::visitStrongReleaseInst(
656660
});
657661
}
658662

659-
void OptRemarkGeneratorInstructionVisitor::visitRetainValueInst(
663+
void AssemblyVisionRemarkGeneratorInstructionVisitor::visitRetainValueInst(
660664
RetainValueInst *rvi) {
661665
ORE.emit([&]() {
662666
using namespace OptRemark;
@@ -677,7 +681,7 @@ void OptRemarkGeneratorInstructionVisitor::visitRetainValueInst(
677681
});
678682
}
679683

680-
void OptRemarkGeneratorInstructionVisitor::visitReleaseValueInst(
684+
void AssemblyVisionRemarkGeneratorInstructionVisitor::visitReleaseValueInst(
681685
ReleaseValueInst *rvi) {
682686
ORE.emit([&]() {
683687
using namespace OptRemark;
@@ -699,7 +703,7 @@ void OptRemarkGeneratorInstructionVisitor::visitReleaseValueInst(
699703
});
700704
}
701705

702-
void OptRemarkGeneratorInstructionVisitor::visitAllocRefInst(
706+
void AssemblyVisionRemarkGeneratorInstructionVisitor::visitAllocRefInst(
703707
AllocRefInst *ari) {
704708
if (ari->canAllocOnStack()) {
705709
return ORE.emit([&]() {
@@ -735,7 +739,7 @@ void OptRemarkGeneratorInstructionVisitor::visitAllocRefInst(
735739
});
736740
}
737741

738-
void OptRemarkGeneratorInstructionVisitor::visitAllocBoxInst(
742+
void AssemblyVisionRemarkGeneratorInstructionVisitor::visitAllocBoxInst(
739743
AllocBoxInst *abi) {
740744
return ORE.emit([&]() {
741745
using namespace OptRemark;
@@ -760,8 +764,8 @@ void OptRemarkGeneratorInstructionVisitor::visitAllocBoxInst(
760764

761765
namespace {
762766

763-
class OptRemarkGenerator : public SILFunctionTransform {
764-
~OptRemarkGenerator() override {}
767+
class AssemblyVisionRemarkGenerator : public SILFunctionTransform {
768+
~AssemblyVisionRemarkGenerator() override {}
765769

766770
bool isOptRemarksEnabled() {
767771
auto *fn = getFunction();
@@ -798,7 +802,7 @@ class OptRemarkGenerator : public SILFunctionTransform {
798802

799803
LLVM_DEBUG(llvm::dbgs() << "Visiting: " << fn->getName() << "\n");
800804
auto &rcfi = *getAnalysis<RCIdentityAnalysis>()->get(fn);
801-
OptRemarkGeneratorInstructionVisitor visitor(*fn, rcfi);
805+
AssemblyVisionRemarkGeneratorInstructionVisitor visitor(*fn, rcfi);
802806
for (auto &block : *fn) {
803807
for (auto &inst : block) {
804808
visitor.visit(&inst);
@@ -809,6 +813,6 @@ class OptRemarkGenerator : public SILFunctionTransform {
809813

810814
} // end anonymous namespace
811815

812-
SILTransform *swift::createOptRemarkGenerator() {
813-
return new OptRemarkGenerator();
816+
SILTransform *swift::createAssemblyVisionRemarkGenerator() {
817+
return new AssemblyVisionRemarkGenerator();
814818
}

lib/SILOptimizer/Transforms/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ target_sources(swiftSILOptimizer PRIVATE
2424
MergeCondFail.cpp
2525
Outliner.cpp
2626
ObjectOutliner.cpp
27-
OptRemarkGenerator.cpp
27+
AssemblyVisionRemarkGenerator.cpp
2828
PerformanceInliner.cpp
2929
PhiArgumentOptimizations.cpp
3030
PruneVTables.cpp

lib/Sema/TypeCheckAttr.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ class AttributeChecker : public AttributeVisitor<AttributeChecker> {
9090
IGNORED_ATTR(RequiresStoredPropertyInits)
9191
IGNORED_ATTR(RestatedObjCConformance)
9292
IGNORED_ATTR(Semantics)
93+
IGNORED_ATTR(EmitAssemblyVisionRemarks)
9394
IGNORED_ATTR(ShowInInterface)
9495
IGNORED_ATTR(SILGenName)
9596
IGNORED_ATTR(StaticInitializeObjCMetadata)

lib/Sema/TypeCheckDeclOverride.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1480,6 +1480,7 @@ namespace {
14801480
UNINTERESTING_ATTR(Required)
14811481
UNINTERESTING_ATTR(Convenience)
14821482
UNINTERESTING_ATTR(Semantics)
1483+
UNINTERESTING_ATTR(EmitAssemblyVisionRemarks)
14831484
UNINTERESTING_ATTR(SetterAccess)
14841485
UNINTERESTING_ATTR(TypeEraser)
14851486
UNINTERESTING_ATTR(SPIAccessControl)

lib/Serialization/ModuleFormat.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ const uint16_t SWIFTMODULE_VERSION_MAJOR = 0;
5656
/// describe what change you made. The content of this comment isn't important;
5757
/// it just ensures a conflict if two people change the module format.
5858
/// Don't worry about adhering to the 80-column limit for this line.
59-
const uint16_t SWIFTMODULE_VERSION_MINOR = 615; // isolated parameters
59+
const uint16_t SWIFTMODULE_VERSION_MINOR = 616; // @_assemblyVision
6060

6161
/// A standard hash seed used for all string hashes in a serialized module.
6262
///

test/SILOptimizer/opt_remark/opt_remark_generator_semantics.swift renamed to test/SILOptimizer/assemblyvision_remark/attributes.swift

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public func forceOptRemark() {
2323
// expected-note @-2 {{of 'x'}}
2424
}
2525

26-
@_semantics("optremark.sil-opt-remark-gen")
26+
@_semantics("optremark.sil-assembly-vision-remark-gen")
2727
@inline(never)
2828
public func forceOptRemark2() {
2929
let x = getGlobal()
@@ -55,7 +55,7 @@ public func allocateInlineCallee3() -> Klass {
5555
}
5656

5757
@_semantics("optremark.sil-inliner")
58-
@_semantics("optremark.sil-opt-remark-gen")
58+
@_semantics("optremark.sil-assembly-vision-remark-gen")
5959
public func mix1() -> (Klass, Klass) {
6060
let x = getGlobal()
6161
return (x, Klass()) // expected-remark {{Pure call. Always profitable to inline "main.Klass.__allocating_init()"}}
@@ -68,7 +68,7 @@ public func mix2() -> (Klass, Klass) {
6868
return (x, Klass()) // expected-remark {{Pure call. Always profitable to inline "main.Klass.__allocating_init()"}}
6969
}
7070

71-
@_semantics("optremark.sil-opt-remark-gen")
71+
@_semantics("optremark.sil-assembly-vision-remark-gen")
7272
public func mix3() -> (Klass, Klass) {
7373
let x = getGlobal()
7474
return (x, Klass()) // expected-remark {{heap allocated ref of type 'Klass'}}
@@ -85,3 +85,10 @@ public func mix5() -> (Klass, Klass) {
8585
let x = getGlobal()
8686
return (x, Klass())
8787
}
88+
89+
@_assemblyVision
90+
public func mix4a() -> (Klass, Klass) {
91+
let x = getGlobal()
92+
return (x, Klass()) // expected-remark {{Pure call. Always profitable to inline "main.Klass.__allocating_init()"}}
93+
// expected-remark @-1 {{heap allocated ref of type 'Klass'}}
94+
}

test/SILOptimizer/opt_remark/opt_remark_generator.sil renamed to test/SILOptimizer/assemblyvision_remark/basic.sil

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: %target-sil-opt -sil-opt-remark-ignore-always-infer -optremarkgen-declless-debugvalue-use-sildebugvar-info -sil-opt-remark-generator -sil-remarks-missed=sil-opt-remark-gen -verify %s -o /dev/null
1+
// RUN: %target-sil-opt -sil-opt-remark-ignore-always-infer -assemblyvisionremarkgen-declless-debugvalue-use-sildebugvar-info -assembly-vision-remark-generator -sil-remarks-missed=sil-assembly-vision-remark-gen -verify %s -o /dev/null
22

33
sil_stage canonical
44

test/SILOptimizer/opt_remark/opt_remark_generator.swift renamed to test/SILOptimizer/assemblyvision_remark/basic.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: %target-swiftc_driver -O -Rpass-missed=sil-opt-remark-gen -Xllvm -sil-disable-pass=FunctionSignatureOpts -Xfrontend -enable-copy-propagation -emit-sil %s -o /dev/null -Xfrontend -verify
1+
// RUN: %target-swiftc_driver -O -Rpass-missed=sil-assembly-vision-remark-gen -Xllvm -sil-disable-pass=FunctionSignatureOpts -Xfrontend -enable-copy-propagation -emit-sil %s -o /dev/null -Xfrontend -verify
22
// REQUIRES: optimized_stdlib,swift_stdlib_no_asserts
33

44
public class Klass {

0 commit comments

Comments
 (0)