| // RUN: %target-swift-frontend -primary-file %s -O -g -S | %FileCheck %s --check-prefix CHECK --check-prefix CHECK-%target-cpu --check-prefix CHECK-OPT-%target-os |
| // RUN: %target-swift-frontend -primary-file %s -g -S | %FileCheck %s --check-prefix CHECK --check-prefix CHECK-%target-cpu --check-prefix CHECK-NOOPT-%target-os |
| |
| import Builtin |
| import Swift |
| |
| // Make sure we emit two traps. |
| |
| // CHECK-LABEL: test_cond_fail: |
| |
| // CHECK-x86_64: {{.cfi_startproc|Lfunc_begin}} |
| // CHECK-i386: .cfi_startproc |
| // CHECK-arm64: .cfi_startproc |
| // CHECK-aarch64: .cfi_startproc |
| // CHECK-armv7: Lfunc_begin |
| // CHECK-armv7s: Lfunc_begin |
| // CHECK-powerpc64: .cfi_startproc |
| // CHECK-powerpc64le: .cfi_startproc |
| // CHECK-s390x: .cfi_startproc |
| // CHECK-OPT-macosx: InlineAsm Start |
| // CHECK-OPT-macosx: InlineAsm End |
| // CHECK-OPT-linux: ##APP |
| // CHECK-OPT-linux: ##NO_APP |
| // CHECK-OPT-windows: ##APP |
| // CHECK-OPT-windows: ##NO_APP |
| // CHECK-OPT-linux-androideabi: @APP |
| // CHECK-OPT-linux-androideabi: @NO_APP |
| // CHECK-OPT-linux-android: //APP |
| // CHECK-OPT-linux-android: //NO_APP |
| // CHECK-NOOPT-macosx-NOT: InlineAsm Start |
| // CHECK-NOOPT-macosx-NOT: InlineAsm End |
| // CHECK-NOOPT-linux-NOT: ##APP |
| // CHECK-NOOPT-linux-NOT: ##NO_APP |
| // CHECK-NOOPT-windows-NOT: ##APP |
| // CHECK-NOOPT-windows-NOT: ##NO_APP |
| // CHECK-OPT-linux-androideabi-NOT: @APP |
| // CHECK-OPT-linux-androideabi-NOT: @NO_APP |
| // CHECK-OPT-linux-android-NOT: //APP |
| // CHECK-OPT-linux-android-NOT: //NO_APP |
| // CHECK-x86_64: ud2 |
| // CHECK-i386: ud2 |
| // CHECK-arm64: brk |
| // CHECK-aarch64: brk |
| // CHECK-armv7: {{trap|.inst 0xe7ffdefe}} |
| // CHECK-armv7s: {{trap|.inst 0xe7ffdefe}} |
| // CHECK-powerpc64: trap |
| // CHECK-powerpc64le: trap |
| // CHECK-s390x: j .Ltmp{{[0-9]+}}+2 |
| // CHECK-NOT-x86_64: {{.cfi_endproc|Lfunc_end}} |
| // CHECK-NOT-i386: .cfi_endproc |
| // CHECK-NOT-arm64: .cfi_endproc |
| // CHECK-NOT-aarch64: .cfi_endproc |
| // CHECK-NOT-armv7: Lfunc_end |
| // CHECK-NOT-armv7s: Lfunc_end |
| // CHECK-NOT-powerpc64: .cfi_endproc |
| // CHECK-NOT-powerpc64le: .cfi_endproc |
| // CHECK-NOT-s390x: .cfi_endproc |
| // CHECK-OPT-macosx: InlineAsm Start |
| // CHECK-OPT-macosx: InlineAsm End |
| // CHECK-OPT-linux: ##APP |
| // CHECK-OPT-linux: ##NO_APP |
| // CHECK-OPT-windows: ##APP |
| // CHECK-OPT-windows: ##NO_APP |
| // CHECK-NOOPT-macosx-NOT: InlineAsm Start |
| // CHECK-NOOPT-macosx-NOT: InlineAsm End |
| // CHECK-NOOPT-linux-NOT: ##APP |
| // CHECK-NOOPT-linux-NOT: ##NO_APP |
| // CHECK-NOOPT-windows-NOT: ##APP |
| // CHECK-NOOPT-windows-NOT: ##NO_APP |
| // CHECK-x86_64: ud2 |
| // CHECK-i386: ud2 |
| // CHECK-arm64: brk |
| // CHECK-aarch64: brk |
| // CHECK-armv7: {{trap|.inst 0xe7ffdefe}} |
| // CHECK-armv7s: {{trap|.inst 0xe7ffdefe}} |
| // CHECK-powerpc64: trap |
| // CHECK-powerpc64le: trap |
| // CHECK-s390x: j .Ltmp{{[0-9]+}}+2 |
| // CHECK-x86_64: {{.cfi_endproc|Lfunc_end}} |
| // CHECK-i386: .cfi_endproc |
| // CHECK-arm64: .cfi_endproc |
| // CHECK-aarch64: .cfi_endproc |
| // CHECK-armv7: Lfunc_end |
| // CHECK-armv7s: Lfunc_end |
| // CHECK-powerpc64: .cfi_endproc |
| // CHECK-powerpc64le: .cfi_endproc |
| // CHECK-s390x: .cfi_endproc |
| sil hidden @test_cond_fail : $@convention(thin) (Int32) -> Int32 { |
| bb0(%0 : $Int32): |
| %2 = integer_literal $Builtin.Int32, 1 |
| %3 = struct_extract %0 : $Int32, #Int32._value |
| %4 = integer_literal $Builtin.Int1, -1 |
| %5 = builtin "sadd_with_overflow_Int32"(%3 : $Builtin.Int32, %2 : $Builtin.Int32, %4 : $Builtin.Int1) : $(Builtin.Int32, Builtin.Int1) |
| %6 = tuple_extract %5 : $(Builtin.Int32, Builtin.Int1), 0 |
| %7 = tuple_extract %5 : $(Builtin.Int32, Builtin.Int1), 1 |
| cond_fail %7 : $Builtin.Int1 |
| %8 = builtin "sadd_with_overflow_Int32"(%6 : $Builtin.Int32, %2 : $Builtin.Int32, %4 : $Builtin.Int1) : $(Builtin.Int32, Builtin.Int1) |
| %9 = tuple_extract %8 : $(Builtin.Int32, Builtin.Int1), 0 |
| %10 = tuple_extract %8 : $(Builtin.Int32, Builtin.Int1), 1 |
| cond_fail %10 : $Builtin.Int1 |
| %11 = struct $Int32 (%9 : $Builtin.Int32) |
| return %11 : $Int32 |
| } |