blob: 0adace8550bc628c0a903488f25a8aec6fc6cfd9 [file] [log] [blame]
// RUN: %target-swift-frontend -module-name OptimizationOptions -Onone -emit-sil -primary-file %s 2>&1 | FileCheck %s --check-prefix=DEBUG
// RUN: %target-swift-frontend -module-name OptimizationOptions -O -emit-sil -primary-file %s 2>&1 | FileCheck %s --check-prefix=RELEASE
// RUN: %target-swift-frontend -module-name OptimizationOptions -Ounchecked -emit-sil -primary-file %s 2>&1 | FileCheck %s --check-prefix=UNCHECKED
// RUN: %target-swift-frontend -module-name OptimizationOptions -Oplayground -emit-sil -primary-file %s 2>&1 | FileCheck %s --check-prefix=PLAYGROUND
// REQUIRES: optimized_stdlib
// REQUIRES: swift_stdlib_asserts
// REQUIRES: swift_stdlib_no_asserts
func test_assert() (x: Int, y: Int) -> Int {
assert(x >= y , "x smaller than y")
return x + y
}
func test_fatal(x: Int, y: Int) -> Int {
if x > y {
return x + y
}
_preconditionFailure("Human nature ...")
}
func test_precondition_check(x: Int, y: Int) -> Int {
_precondition(x > y, "test precondition check")
return x + y
}
func test_partial_safety_check(x: Int, y: Int) -> Int {
_debugPrecondition(x > y, "test partial safety check")
return x + y
}
// In debug mode keep user asserts and runtime checks.
// DEBUG-LABEL: _TF19OptimizationOptions11test_assertfT_FT1xSi1ySi_Si
// DEBUG: "x smaller than y"
// DEBUG: "assertion failed"
// DEBUG: cond_fail
// In playground mode keep user asserts and runtime checks.
// PLAYGROUND-LABEL: _TF19OptimizationOptions11test_assertfT_FT1xSi1ySi_Si
// PLAYGROUND: "x smaller than y"
// PLAYGROUND: "assertion failed"
// PLAYGROUND: cond_fail
// In release mode remove user asserts and keep runtime checks.
// RELEASE-LABEL: _TF19OptimizationOptions11test_assertfT_FT1xSi1ySi_Si
// RELEASE-NOT: "x smaller than y"
// RELEASE-NOT: "assertion failed"
// RELEASE: cond_fail
// In fast mode remove user asserts and runtime checks.
// FAST-LABEL: _TF19OptimizationOptions11test_assertfT_FT1xSi1ySi_Si
// FAST-NOT: "x smaller than y"
// FAST-NOT: "assertion failed"
// FAST-NOT: cond_fail
// In debug mode keep verbose fatal errors.
// DEBUG-LABEL: _TF19OptimizationOptions10test_fatalFTSiSi_Si
// DEBUG-DAG: "Human nature ..."
// DEBUG-DAG: %[[FATAL_ERROR:.+]] = function_ref @_TTOS_nndd__TFs18_fatalErrorMessageFTVs12StaticStringS_S_Su_T_
// DEBUG: apply %[[FATAL_ERROR]]({{.*}})
// DEBUG: unreachable
// In playground mode keep verbose fatal errors.
// PLAYGROUND-LABEL: _TF19OptimizationOptions10test_fatalFTSiSi_Si
// PLAYGROUND-DAG: "Human nature ..."
// PLAYGROUND-DAG: %[[FATAL_ERROR:.+]] = function_ref @_TTOS_nndd__TFs18_fatalErrorMessageFTVs12StaticStringS_S_Su_T_
// PLAYGROUND: apply %[[FATAL_ERROR]]({{.*}})
// PLAYGROUND: unreachable
// In release mode keep succinct fatal errors (trap).
// RELEASE-LABEL: _TF19OptimizationOptions10test_fatalFTSiSi_Si
// RELEASE-NOT: "Human nature ..."
// RELEASE-NOT: "fatal error"
// RELEASE: bb2:
// RELEASE: %[[ALWAYS:.+]] = integer_literal $Builtin.Int1, -1
// RELEASE: cond_fail %[[ALWAYS]]
// In fast mode remove fatal errors.
// FAST-LABEL: _TF19OptimizationOptions10test_fatalFTSiSi_Si
// FAST-NOT: "Human nature ..."
// FAST-NOT: "fatal error"
// FAST-NOT: int_trap
// Precondition safety checks.
// In debug mode keep verbose library precondition checks.
// DEBUG-LABEL: _TF19OptimizationOptions23test_precondition_checkFTSiSi_Si
// DEBUG-DAG: "fatal error"
// DEBUG-DAG: %[[FATAL_ERROR:.+]] = function_ref @_TTOS_nndd__TFs18_fatalErrorMessageFTVs12StaticStringS_S_Su_T_
// DEBUG: apply %[[FATAL_ERROR]]({{.*}})
// DEBUG: unreachable
// DEBUG: return
// In playground mode keep verbose library precondition checks.
// PLAYGROUND-LABEL: _TF19OptimizationOptions23test_precondition_checkFTSiSi_Si
// PLAYGROUND-DAG: "fatal error"
// PLAYGROUND-DAG: %[[FATAL_ERROR:.+]] = function_ref @_TTOS_nndd__TFs18_fatalErrorMessageFTVs12StaticStringS_S_Su_T_
// PLAYGROUND: apply %[[FATAL_ERROR]]({{.*}})
// PLAYGROUND: unreachable
// PLAYGROUND: return
// In release mode keep succinct library precondition checks (trap).
// RELEASE-LABEL: _TF19OptimizationOptions23test_precondition_checkFTSiSi_Si
// RELEASE-NOT: "fatal error"
// RELEASE: %[[V2:.+]] = builtin "xor_Int1"(%{{.+}}, %{{.+}})
// RELEASE: cond_fail %[[V2]]
// RELEASE: return
// In unchecked mode remove library precondition checks.
// UNCHECKED-LABEL: _TF19OptimizationOptions23test_precondition_checkFTSiSi_Si
// UNCHECKED-NOT: "fatal error"
// UNCHECKED-NOT: builtin "int_trap"
// UNCHECKED-NOT: unreachable
// UNCHECKED: return
// Partial safety checks.
// In debug mode keep verbose partial safety checks.
// DEBUG-LABEL: _TF19OptimizationOptions25test_partial_safety_checkFTSiSi_Si
// DEBUG-DAG: "fatal error"
// DEBUG-DAG: %[[FATAL_ERROR:.+]] = function_ref @_TTOS_nndd__TFs18_fatalErrorMessageFTVs12StaticStringS_S_Su_T_
// DEBUG: apply %[[FATAL_ERROR]]({{.*}})
// DEBUG: unreachable
// In playground mode keep verbose partial safety checks.
// PLAYGROUND-LABEL: _TF19OptimizationOptions25test_partial_safety_checkFTSiSi_Si
// PLAYGROUND-DAG: "fatal error"
// PLAYGROUND-DAG: %[[FATAL_ERROR:.+]] = function_ref @_TTOS_nndd__TFs18_fatalErrorMessageFTVs12StaticStringS_S_Su_T_
// PLAYGROUND: apply %[[FATAL_ERROR]]({{.*}})
// PLAYGROUND: unreachable
// In release mode remove partial safety checks.
// RELEASE-LABEL: _TF19OptimizationOptions25test_partial_safety_checkFTSiSi_Si
// RELEASE-NOT: "fatal error"
// RELEASE-NOT: builtin "int_trap"
// RELEASE-NOT: unreachable
// RELEASE: return
// In fast mode remove partial safety checks.
// FAST-LABEL: _TF19OptimizationOptions25test_partial_safety_checkFTSiSi_Si
// FAST-NOT: "fatal error"
// FAST-NOT: builtin "int_trap"
// FAST-NOT: unreachable
// FAST: return