Files
Erik Eckstein 0494037b1e Optimizer: fix optimization of unconditional cond_fails
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
2026-04-09 16:42:29 +02:00

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)
}
}
}