Sanjoy Das | 16901a3 | 2016-01-20 00:06:14 +0000 | [diff] [blame] | 1 | ; RUN: llc -mtriple=x86_64-apple-macosx -O3 -enable-implicit-null-checks -o - < %s 2>&1 | FileCheck %s |
| 2 | |
| 3 | declare void @throw0() |
| 4 | declare void @throw1() |
| 5 | |
| 6 | define i1 @f(i8* %p0, i8* %p1) { |
| 7 | entry: |
| 8 | %c0 = icmp eq i8* %p0, null |
| 9 | br i1 %c0, label %throw0, label %continue0, !make.implicit !0 |
| 10 | |
| 11 | continue0: |
| 12 | %v0 = load i8, i8* %p0 |
| 13 | %c1 = icmp eq i8* %p1, null |
| 14 | br i1 %c1, label %throw1, label %continue1, !make.implicit !0 |
| 15 | |
| 16 | continue1: |
| 17 | %v1 = load i8, i8* %p1 |
| 18 | %v = icmp eq i8 %v0, %v1 |
| 19 | ret i1 %v |
| 20 | |
| 21 | throw0: |
| 22 | call void @throw0() |
| 23 | unreachable |
| 24 | |
| 25 | throw1: |
| 26 | call void @throw1() |
| 27 | unreachable |
| 28 | } |
| 29 | |
Sanjoy Das | 881de4d | 2016-02-02 02:32:43 +0000 | [diff] [blame] | 30 | declare void @foo() |
| 31 | |
| 32 | declare token @llvm.experimental.gc.statepoint.p0f_isVoidf(i64, i32, void ()*, i32, i32, ...) |
| 33 | declare i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token, i32, i32) nounwind readonly |
| 34 | |
| 35 | ; Check for a crash. The crash is not specific to statepoints, but |
| 36 | ; gc.statpeoint is an easy way to generate a fill instruction in |
| 37 | ; %continue0 (which causes the llc crash). |
| 38 | define i1 @g(i8 addrspace(1)* %p0, i8* %p1) gc "statepoint-example" { |
| 39 | entry: |
| 40 | %c0 = icmp eq i8 addrspace(1)* %p0, null |
| 41 | %tok = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 0, i8 addrspace(1)* %p0) |
| 42 | %p0.relocated = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tok, i32 7, i32 7) ; (%p0, %p0) |
| 43 | br i1 %c0, label %throw0, label %continue0, !make.implicit !0 |
| 44 | |
| 45 | continue0: |
| 46 | %c1 = icmp eq i8* %p1, null |
| 47 | br i1 %c1, label %throw1, label %continue1, !make.implicit !0 |
| 48 | |
| 49 | continue1: |
| 50 | %v0 = load i8, i8 addrspace(1)* %p0.relocated |
| 51 | %v1 = load i8, i8* %p1 |
| 52 | %v = icmp eq i8 %v0, %v1 |
| 53 | ret i1 %v |
| 54 | |
| 55 | throw0: |
| 56 | call void @throw0() |
| 57 | unreachable |
| 58 | |
| 59 | throw1: |
| 60 | call void @throw1() |
| 61 | unreachable |
| 62 | } |
| 63 | |
Sanjoy Das | 16901a3 | 2016-01-20 00:06:14 +0000 | [diff] [blame] | 64 | ; Check that we have two implicit null checks in @f |
| 65 | |
| 66 | ; CHECK: __LLVM_FaultMaps: |
| 67 | ; CHECK-NEXT: .byte 1 |
| 68 | ; CHECK-NEXT: .byte 0 |
| 69 | ; CHECK-NEXT: .short 0 |
Kevin B. Smith | 54566a0 | 2016-06-15 16:37:46 +0000 | [diff] [blame] | 70 | ; CHECK-NEXT: .long 1 |
Sanjoy Das | 16901a3 | 2016-01-20 00:06:14 +0000 | [diff] [blame] | 71 | |
| 72 | ; FunctionInfo[0] = |
| 73 | |
| 74 | ; FunctionAddress = |
| 75 | ; CHECK-NEXT: .quad _f |
| 76 | |
| 77 | ; NumFaultingPCs = |
| 78 | ; CHECK-NEXT: .long 2 |
| 79 | |
| 80 | ; Reserved = |
| 81 | ; CHECK-NEXT: .long 0 |
| 82 | |
| 83 | !0 = !{} |