| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 |
| ; RUN: llc < %s -mtriple=nvptx -mcpu=sm_20 -verify-machineinstrs -trap-unreachable=false \ |
| ; RUN: | FileCheck %s --check-prefixes=CHECK,NO-TRAP-UNREACHABLE |
| ; RUN: llc < %s -mtriple=nvptx64 -mcpu=sm_20 -verify-machineinstrs -trap-unreachable=false \ |
| ; RUN: | FileCheck %s --check-prefixes=CHECK,NO-TRAP-UNREACHABLE |
| ; RUN: llc < %s -mtriple=nvptx -mcpu=sm_20 -verify-machineinstrs -trap-unreachable -no-trap-after-noreturn \ |
| ; RUN: | FileCheck %s --check-prefixes=CHECK,NO-TRAP-AFTER-NORETURN |
| ; RUN: llc < %s -mtriple=nvptx64 -mcpu=sm_20 -verify-machineinstrs -trap-unreachable -no-trap-after-noreturn \ |
| ; RUN: | FileCheck %s --check-prefixes=CHECK,NO-TRAP-AFTER-NORETURN |
| ; RUN: llc < %s -mtriple=nvptx -mcpu=sm_20 -verify-machineinstrs -trap-unreachable -no-trap-after-noreturn=false \ |
| ; RUN: | FileCheck %s --check-prefixes=CHECK,TRAP |
| ; RUN: llc < %s -mtriple=nvptx64 -mcpu=sm_20 -verify-machineinstrs -trap-unreachable -no-trap-after-noreturn=false \ |
| ; RUN: | FileCheck %s --check-prefixes=CHECK,TRAP |
| ; RUN: llc < %s -mtriple=nvptx64 -mcpu=sm_20 -verify-machineinstrs -trap-unreachable -mattr=+ptx83 \ |
| ; RUN: | FileCheck %s --check-prefixes=BUG-FIXED |
| ; RUN: %if ptxas && !ptxas-12.0 %{ llc < %s -mtriple=nvptx -mcpu=sm_20 -verify-machineinstrs | %ptxas-verify %} |
| ; RUN: %if ptxas %{ llc < %s -mtriple=nvptx64 -mcpu=sm_20 -verify-machineinstrs | %ptxas-verify %} |
| |
| target triple = "nvptx-unknown-cuda" |
| |
| declare void @throw() #0 |
| declare void @llvm.trap() #0 |
| |
| define ptx_kernel void @kernel_func() { |
| ; NO-TRAP-UNREACHABLE-LABEL: kernel_func( |
| ; NO-TRAP-UNREACHABLE: { |
| ; NO-TRAP-UNREACHABLE-EMPTY: |
| ; NO-TRAP-UNREACHABLE-EMPTY: |
| ; NO-TRAP-UNREACHABLE-NEXT: // %bb.0: |
| ; NO-TRAP-UNREACHABLE-NEXT: { // callseq 0, 0 |
| ; NO-TRAP-UNREACHABLE-NEXT: call.uni |
| ; NO-TRAP-UNREACHABLE-NEXT: throw, |
| ; NO-TRAP-UNREACHABLE-NEXT: ( |
| ; NO-TRAP-UNREACHABLE-NEXT: ); |
| ; NO-TRAP-UNREACHABLE-NEXT: } // callseq 0 |
| ; NO-TRAP-UNREACHABLE-NEXT: // begin inline asm |
| ; NO-TRAP-UNREACHABLE-NEXT: exit; |
| ; NO-TRAP-UNREACHABLE-NEXT: // end inline asm |
| ; |
| ; NO-TRAP-AFTER-NORETURN-LABEL: kernel_func( |
| ; NO-TRAP-AFTER-NORETURN: { |
| ; NO-TRAP-AFTER-NORETURN-EMPTY: |
| ; NO-TRAP-AFTER-NORETURN-EMPTY: |
| ; NO-TRAP-AFTER-NORETURN-NEXT: // %bb.0: |
| ; NO-TRAP-AFTER-NORETURN-NEXT: { // callseq 0, 0 |
| ; NO-TRAP-AFTER-NORETURN-NEXT: call.uni |
| ; NO-TRAP-AFTER-NORETURN-NEXT: throw, |
| ; NO-TRAP-AFTER-NORETURN-NEXT: ( |
| ; NO-TRAP-AFTER-NORETURN-NEXT: ); |
| ; NO-TRAP-AFTER-NORETURN-NEXT: } // callseq 0 |
| ; NO-TRAP-AFTER-NORETURN-NEXT: // begin inline asm |
| ; NO-TRAP-AFTER-NORETURN-NEXT: exit; |
| ; NO-TRAP-AFTER-NORETURN-NEXT: // end inline asm |
| ; NO-TRAP-AFTER-NORETURN-NEXT: trap; exit; |
| ; |
| ; TRAP-LABEL: kernel_func( |
| ; TRAP: { |
| ; TRAP-EMPTY: |
| ; TRAP-EMPTY: |
| ; TRAP-NEXT: // %bb.0: |
| ; TRAP-NEXT: { // callseq 0, 0 |
| ; TRAP-NEXT: call.uni |
| ; TRAP-NEXT: throw, |
| ; TRAP-NEXT: ( |
| ; TRAP-NEXT: ); |
| ; TRAP-NEXT: } // callseq 0 |
| ; TRAP-NEXT: trap; exit; |
| ; |
| ; BUG-FIXED-LABEL: kernel_func( |
| ; BUG-FIXED: { |
| ; BUG-FIXED-EMPTY: |
| ; BUG-FIXED-EMPTY: |
| ; BUG-FIXED-NEXT: // %bb.0: |
| ; BUG-FIXED-NEXT: { // callseq 0, 0 |
| ; BUG-FIXED-NEXT: call.uni |
| ; BUG-FIXED-NEXT: throw, |
| ; BUG-FIXED-NEXT: ( |
| ; BUG-FIXED-NEXT: ); |
| ; BUG-FIXED-NEXT: } // callseq 0 |
| ; BUG-FIXED-NEXT: trap; |
| call void @throw() |
| unreachable |
| } |
| |
| define void @kernel_func_2() { |
| ; CHECK-LABEL: kernel_func_2( |
| ; CHECK: { |
| ; CHECK-EMPTY: |
| ; CHECK-EMPTY: |
| ; CHECK-NEXT: // %bb.0: |
| ; CHECK-NEXT: trap; exit; |
| ; |
| ; BUG-FIXED-LABEL: kernel_func_2( |
| ; BUG-FIXED: { |
| ; BUG-FIXED-EMPTY: |
| ; BUG-FIXED-EMPTY: |
| ; BUG-FIXED-NEXT: // %bb.0: |
| ; BUG-FIXED-NEXT: trap; |
| call void @llvm.trap() |
| ; Make sure we avoid emitting two trap instructions. |
| unreachable |
| } |
| |
| attributes #0 = { noreturn } |