Files
swift-mirror/SwiftCompilerSources/Sources/Optimizer/InstructionSimplification/SimplifyAllocRefDynamic.swift
Erik Eckstein 3f95ce9645 Optimizer: fix spelling of the Simplifiable protocol
Rename `Simplifyable` -> `Simplifiable`

NFC
2025-02-12 09:01:11 +01:00

55 lines
2.1 KiB
Swift

//===--- SimplifyAllocRefDynamic.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
extension AllocRefDynamicInst : OnoneSimplifiable {
func simplify(_ context: SimplifyContext) {
/// Optimize alloc_ref_dynamic of a known type to alloc_ref:
///
/// %3 = metatype SubClass.Type
/// %4 = upcast %3 : SubClass.Type to BaseClass.Type
/// %6 = alloc_ref_dynamic [...] %4 : BaseClass.Type, $BaseClass
/// %8 = (... some use of ...) %6 : $BaseClass
/// ->
/// %6 = alloc_ref [...] $SubClass
/// %7 = upcast %6 : $SubClass to $BaseClass
/// %8 = (... some use of ...) %7 : $BaseClass
let type: Type
let emitUpcast: Bool
if let metatypeInst = metatypeOperand.value as? MetatypeInst {
type = metatypeInst.type.loweredInstanceTypeOfMetatype(in: parentFunction)
emitUpcast = false
} else if let upcastInst = metatypeOperand.value as? UpcastInst,
let metatypeInst = upcastInst.operands[0].value as? MetatypeInst {
type = metatypeInst.type.loweredInstanceTypeOfMetatype(in: parentFunction)
emitUpcast = true
} else {
return
}
let builder = Builder(before: self, context)
let newAlloc = builder.createAllocRef(type, isObjC: self.isObjC, canAllocOnStack: self.canAllocOnStack, isBare: false,
tailAllocatedTypes: self.tailAllocatedTypes, tailAllocatedCounts: Array(self.tailAllocatedCounts.values))
let result: Value
if emitUpcast {
result = builder.createUpcast(from: newAlloc, to: self.type)
} else {
result = newAlloc
}
uses.replaceAll(with: result, context)
context.erase(instruction: self)
}
}