mirror of
https://github.com/apple/swift.git
synced 2026-06-20 15:42:51 +02:00
0494037b1e
When the option `-remove-runtime-asserts` is used all `cond_fail` instructions are removed. However, the cast optimizer inserts such unconditional fails for failing casts. This ended up in an infinite optimization loop in SILCombine. The fix is 1. don't remove unconditional `cond_fail`s, even if with the `-remove-runtime-asserts` option. This also has the benefit that it enables later optimizations to remove all the dead code after such an unconditional `cond_fail`. 2. Don't optimize a failing cast if it is already preceded by an unconditional `cond_fail` This bug was introduced by https://github.com/swiftlang/swift/pull/88258 Fixes a compiler hang rdar://174185165
38 lines
1.3 KiB
Swift
38 lines
1.3 KiB
Swift
//===--- SimplifyCondFail.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 CondFailInst : OnoneSimplifiable, SILCombineSimplifiable {
|
|
func simplify(_ context: SimplifyContext) {
|
|
|
|
if let literal = condition as? IntegerLiteralInst, let value = literal.value {
|
|
if value == 0 {
|
|
// Eliminates
|
|
// ```
|
|
// %0 = integer_literal 0
|
|
// cond_fail %0, "message"
|
|
// ```
|
|
context.erase(instruction: self)
|
|
}
|
|
// Even if `shouldRemoveCondFail` is true, we don't want to remove unconditioal fails,
|
|
// i.e. `cond_fail` with a non-zero condition, because this would prevent removing dead
|
|
// code after such a `cond_fail` in a later optimization.
|
|
return
|
|
}
|
|
|
|
if context.options.shouldRemoveCondFail(withMessage: message, inFunction: parentFunction.name) {
|
|
context.erase(instruction: self)
|
|
}
|
|
}
|
|
}
|