mirror of
https://github.com/apple/swift.git
synced 2026-06-20 15:42:51 +02:00
6dde4c942e
Do this even if the function then contains references to other functions with wrong linkage. MandatoryPerformanceOptimization fixes the linkage afterwards. This is similar to what we already do with de-virtualizing class and witness methods: https://github.com/swiftlang/swift/pull/76032 rdar://168171608
37 lines
1.2 KiB
Swift
37 lines
1.2 KiB
Swift
//===--- DeinitDevirtualizer.swift ----------------------------------------===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2023 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See https://swift.org/LICENSE.txt for license information
|
|
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
import SIL
|
|
|
|
/// Devirtualizes destroys of non-copyable values.
|
|
///
|
|
let deinitDevirtualizer = FunctionPass(name: "deinit-devirtualizer") {
|
|
(function: Function, context: FunctionPassContext) in
|
|
|
|
guard function.hasOwnership else {
|
|
return
|
|
}
|
|
|
|
for inst in function.instructions {
|
|
switch inst {
|
|
case let destroyValue as DestroyValueInst:
|
|
_ = devirtualizeDeinits(of: destroyValue, isMandatory: false, context)
|
|
case let destroyAddr as DestroyAddrInst:
|
|
_ = devirtualizeDeinits(of: destroyAddr, isMandatory: false, context)
|
|
case let builtin as BuiltinInst:
|
|
_ = devirtualizeDeinits(of: builtin, isMandatory: false, context)
|
|
default:
|
|
break
|
|
}
|
|
}
|
|
}
|