Files
swift-mirror/test/SILOptimizer/unreachable_dealloc_stack.sil
Mark Lacey e2cbc5b1c3 Relax verification of dealloc_stack.
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.
2016-04-24 11:10:01 -07:00

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