diff --git a/lib/SILOptimizer/PassManager/PassPipeline.cpp b/lib/SILOptimizer/PassManager/PassPipeline.cpp index 7374131e8a8ea..313bf5f5f8467 100644 --- a/lib/SILOptimizer/PassManager/PassPipeline.cpp +++ b/lib/SILOptimizer/PassManager/PassPipeline.cpp @@ -174,13 +174,22 @@ static void addMandatoryDiagnosticOptPipeline(SILPassPipelinePlan &P) { if (EnableDeinitDevirtualizer) P.addDeinitDevirtualizer(); + // FIXME: rdar://122701694 (`consuming` keyword causes verification error on + // invalid SIL types) + // // Lower move only wrapped trivial types. - P.addTrivialMoveOnlyTypeEliminator(); + // P.addTrivialMoveOnlyTypeEliminator(); + // Check no uses after consume operator of a value in an address. P.addConsumeOperatorCopyableAddressesChecker(); // No uses after consume operator of copyable value. P.addConsumeOperatorCopyableValuesChecker(); + // As a temporary measure, we also eliminate move only for non-trivial types + // until we can audit the later part of the pipeline. Eventually, this should + // occur before IRGen. + P.addMoveOnlyTypeEliminator(); + // // End Ownership Optimizations //===--- @@ -246,11 +255,6 @@ static void addMandatoryDiagnosticOptPipeline(SILPassPipelinePlan &P) { // Canonical swift requires all non cond_br critical edges to be split. P.addSplitNonCondBrCriticalEdges(); - // As a temporary measure, we also eliminate move only for non-trivial types - // until we can audit the later part of the pipeline. Eventually, this should - // occur before IRGen. - P.addMoveOnlyTypeEliminator(); - // For embedded Swift: Specialize generic class vtables. P.addVTableSpecializer(); diff --git a/test/SILOptimizer/noimplicitcopy_consuming_parameters.swift b/test/SILOptimizer/noimplicitcopy_consuming_parameters.swift index 380ca517062a7..7f28c1f158dfa 100644 --- a/test/SILOptimizer/noimplicitcopy_consuming_parameters.swift +++ b/test/SILOptimizer/noimplicitcopy_consuming_parameters.swift @@ -9,6 +9,7 @@ public class Klass { public struct NonTrivialStruct { var k = Klass() + let i = 0 func doSomethingDefault() {} borrowing func doSomethingBorrowing() {} @@ -230,6 +231,10 @@ func testLoadableConsumingCopyOperator(_ x: consuming NonTrivialStruct) { _ = copy x } +func testLoadableConsumingTrivialLetField(_ x: consuming NonTrivialStruct) -> Int { + return x.i +} + ////////////////////////////////////////// // MARK: Trivial Struct Consuming Tests // //////////////////////////////////////////