mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Allow it to have undef as an operand. This can happen when NoReturnFolding does RAUW for the instructions that come after a @noreturn function, replacing the uses of those instructions in blocks that are unreachable. These instructions end up getting deleted during diagnose unreachable when we remove the unreachable code. Fixes SR-967 / rdar://problem/25882880.
35 lines
999 B
Plaintext
35 lines
999 B
Plaintext
// RUN: %target-sil-opt -enable-sil-verify-all %s -diagnostics | FileCheck %s
|
|
|
|
sil_stage raw
|
|
|
|
import Builtin
|
|
|
|
class TheClass {}
|
|
|
|
// Ensure that when we remove the code after the apply of noreturn
|
|
// function nada, we don't fail verification on a dealloc_stack with
|
|
// an undef operand, but that we do later remove it in the diagnostics
|
|
// passes.
|
|
|
|
// CHECK-LABEL: sil @unreachable_dealloc_stack
|
|
sil @unreachable_dealloc_stack: $@convention(method) (@guaranteed TheClass) -> () {
|
|
bb0(%0 : $TheClass):
|
|
%1 = function_ref @nada : $@convention(c) @noreturn (Builtin.Int32) -> ()
|
|
%2 = integer_literal $Builtin.Int32, 0
|
|
// CHECK: apply{{.*}}
|
|
%3 = apply %1(%2) : $@convention(c) @noreturn (Builtin.Int32) -> ()
|
|
// CHECK-NEXT: unreachable
|
|
// CHECK-NOT: dealloc_stack
|
|
%4 = alloc_stack $TheClass
|
|
store %0 to %4 : $*TheClass
|
|
br bb1
|
|
|
|
bb1:
|
|
dealloc_stack %4 : $*TheClass
|
|
%5 = tuple ()
|
|
return %5 : $()
|
|
}
|
|
|
|
// CHECK-LABEL: sil @nada
|
|
sil @nada : $@convention(c) @noreturn (Builtin.Int32) -> ()
|