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 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 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 70 ; CHECK-NEXT: .long 1 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 = !{} 84