1*9880d681SAndroid Build Coastguard Worker; RUN: llc -verify-machineinstrs -O3 -mtriple=x86_64-apple-macosx -enable-implicit-null-checks < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-apple-macosx -enable-implicit-null-checks \ 4*9880d681SAndroid Build Coastguard Worker; RUN: | llvm-mc -triple x86_64-apple-macosx -filetype=obj -o - \ 5*9880d681SAndroid Build Coastguard Worker; RUN: | llvm-objdump -triple x86_64-apple-macosx -fault-map-section - \ 6*9880d681SAndroid Build Coastguard Worker; RUN: | FileCheck %s -check-prefix OBJDUMP 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -enable-implicit-null-checks \ 9*9880d681SAndroid Build Coastguard Worker; RUN: | llvm-mc -triple x86_64-unknown-linux-gnu -filetype=obj -o - \ 10*9880d681SAndroid Build Coastguard Worker; RUN: | llvm-objdump -triple x86_64-unknown-linux-gnu -fault-map-section - \ 11*9880d681SAndroid Build Coastguard Worker; RUN: | FileCheck %s -check-prefix OBJDUMP 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Workerdefine i32 @imp_null_check_load(i32* %x) { 14*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _imp_null_check_load: 15*9880d681SAndroid Build Coastguard Worker; CHECK: [[BB0_imp_null_check_load:L[^:]+]]: 16*9880d681SAndroid Build Coastguard Worker; CHECK: movl (%rdi), %eax 17*9880d681SAndroid Build Coastguard Worker; CHECK: retq 18*9880d681SAndroid Build Coastguard Worker; CHECK: [[BB1_imp_null_check_load:LBB0_[0-9]+]]: 19*9880d681SAndroid Build Coastguard Worker; CHECK: movl $42, %eax 20*9880d681SAndroid Build Coastguard Worker; CHECK: retq 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker entry: 23*9880d681SAndroid Build Coastguard Worker %c = icmp eq i32* %x, null 24*9880d681SAndroid Build Coastguard Worker br i1 %c, label %is_null, label %not_null, !make.implicit !0 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Worker is_null: 27*9880d681SAndroid Build Coastguard Worker ret i32 42 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker not_null: 30*9880d681SAndroid Build Coastguard Worker %t = load i32, i32* %x 31*9880d681SAndroid Build Coastguard Worker ret i32 %t 32*9880d681SAndroid Build Coastguard Worker} 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Workerdefine i32 @imp_null_check_gep_load(i32* %x) { 35*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _imp_null_check_gep_load: 36*9880d681SAndroid Build Coastguard Worker; CHECK: [[BB0_imp_null_check_gep_load:L[^:]+]]: 37*9880d681SAndroid Build Coastguard Worker; CHECK: movl 128(%rdi), %eax 38*9880d681SAndroid Build Coastguard Worker; CHECK: retq 39*9880d681SAndroid Build Coastguard Worker; CHECK: [[BB1_imp_null_check_gep_load:LBB1_[0-9]+]]: 40*9880d681SAndroid Build Coastguard Worker; CHECK: movl $42, %eax 41*9880d681SAndroid Build Coastguard Worker; CHECK: retq 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker entry: 44*9880d681SAndroid Build Coastguard Worker %c = icmp eq i32* %x, null 45*9880d681SAndroid Build Coastguard Worker br i1 %c, label %is_null, label %not_null, !make.implicit !0 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker is_null: 48*9880d681SAndroid Build Coastguard Worker ret i32 42 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker not_null: 51*9880d681SAndroid Build Coastguard Worker %x.gep = getelementptr i32, i32* %x, i32 32 52*9880d681SAndroid Build Coastguard Worker %t = load i32, i32* %x.gep 53*9880d681SAndroid Build Coastguard Worker ret i32 %t 54*9880d681SAndroid Build Coastguard Worker} 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Workerdefine i32 @imp_null_check_add_result(i32* %x, i32 %p) { 57*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _imp_null_check_add_result: 58*9880d681SAndroid Build Coastguard Worker; CHECK: [[BB0_imp_null_check_add_result:L[^:]+]]: 59*9880d681SAndroid Build Coastguard Worker; CHECK: addl (%rdi), %esi 60*9880d681SAndroid Build Coastguard Worker; CHECK: movl %esi, %eax 61*9880d681SAndroid Build Coastguard Worker; CHECK: retq 62*9880d681SAndroid Build Coastguard Worker; CHECK: [[BB1_imp_null_check_add_result:LBB2_[0-9]+]]: 63*9880d681SAndroid Build Coastguard Worker; CHECK: movl $42, %eax 64*9880d681SAndroid Build Coastguard Worker; CHECK: retq 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker entry: 67*9880d681SAndroid Build Coastguard Worker %c = icmp eq i32* %x, null 68*9880d681SAndroid Build Coastguard Worker br i1 %c, label %is_null, label %not_null, !make.implicit !0 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Worker is_null: 71*9880d681SAndroid Build Coastguard Worker ret i32 42 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker not_null: 74*9880d681SAndroid Build Coastguard Worker %t = load i32, i32* %x 75*9880d681SAndroid Build Coastguard Worker %p1 = add i32 %t, %p 76*9880d681SAndroid Build Coastguard Worker ret i32 %p1 77*9880d681SAndroid Build Coastguard Worker} 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Workerdefine i32 @imp_null_check_hoist_over_unrelated_load(i32* %x, i32* %y, i32* %z) { 80*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _imp_null_check_hoist_over_unrelated_load: 81*9880d681SAndroid Build Coastguard Worker; CHECK: [[BB0_imp_null_check_hoist_over_unrelated_load:L[^:]+]]: 82*9880d681SAndroid Build Coastguard Worker; CHECK: movl (%rdi), %eax 83*9880d681SAndroid Build Coastguard Worker; CHECK: movl (%rsi), %ecx 84*9880d681SAndroid Build Coastguard Worker; CHECK: movl %ecx, (%rdx) 85*9880d681SAndroid Build Coastguard Worker; CHECK: retq 86*9880d681SAndroid Build Coastguard Worker; CHECK: [[BB1_imp_null_check_hoist_over_unrelated_load:LBB3_[0-9]+]]: 87*9880d681SAndroid Build Coastguard Worker; CHECK: movl $42, %eax 88*9880d681SAndroid Build Coastguard Worker; CHECK: retq 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Worker entry: 91*9880d681SAndroid Build Coastguard Worker %c = icmp eq i32* %x, null 92*9880d681SAndroid Build Coastguard Worker br i1 %c, label %is_null, label %not_null, !make.implicit !0 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Worker is_null: 95*9880d681SAndroid Build Coastguard Worker ret i32 42 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Worker not_null: 98*9880d681SAndroid Build Coastguard Worker %t0 = load i32, i32* %y 99*9880d681SAndroid Build Coastguard Worker %t1 = load i32, i32* %x 100*9880d681SAndroid Build Coastguard Worker store i32 %t0, i32* %z 101*9880d681SAndroid Build Coastguard Worker ret i32 %t1 102*9880d681SAndroid Build Coastguard Worker} 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Workerdefine i32 @imp_null_check_via_mem_comparision(i32* %x, i32 %val) { 105*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _imp_null_check_via_mem_comparision 106*9880d681SAndroid Build Coastguard Worker; CHECK: [[BB0_imp_null_check_via_mem_comparision:L[^:]+]]: 107*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl %esi, 4(%rdi) 108*9880d681SAndroid Build Coastguard Worker; CHECK: jge LBB4_2 109*9880d681SAndroid Build Coastguard Worker; CHECK: movl $100, %eax 110*9880d681SAndroid Build Coastguard Worker; CHECK: retq 111*9880d681SAndroid Build Coastguard Worker; CHECK: [[BB1_imp_null_check_via_mem_comparision:LBB4_[0-9]+]]: 112*9880d681SAndroid Build Coastguard Worker; CHECK: movl $42, %eax 113*9880d681SAndroid Build Coastguard Worker; CHECK: retq 114*9880d681SAndroid Build Coastguard Worker; CHECK: LBB4_2: 115*9880d681SAndroid Build Coastguard Worker; CHECK: movl $200, %eax 116*9880d681SAndroid Build Coastguard Worker; CHECK: retq 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker entry: 119*9880d681SAndroid Build Coastguard Worker %c = icmp eq i32* %x, null 120*9880d681SAndroid Build Coastguard Worker br i1 %c, label %is_null, label %not_null, !make.implicit !0 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Worker is_null: 123*9880d681SAndroid Build Coastguard Worker ret i32 42 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Worker not_null: 126*9880d681SAndroid Build Coastguard Worker %x.loc = getelementptr i32, i32* %x, i32 1 127*9880d681SAndroid Build Coastguard Worker %t = load i32, i32* %x.loc 128*9880d681SAndroid Build Coastguard Worker %m = icmp slt i32 %t, %val 129*9880d681SAndroid Build Coastguard Worker br i1 %m, label %ret_100, label %ret_200 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Worker ret_100: 132*9880d681SAndroid Build Coastguard Worker ret i32 100 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Worker ret_200: 135*9880d681SAndroid Build Coastguard Worker ret i32 200 136*9880d681SAndroid Build Coastguard Worker} 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Worker!0 = !{} 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: __LLVM_FaultMaps: 141*9880d681SAndroid Build Coastguard Worker 142*9880d681SAndroid Build Coastguard Worker; Version: 143*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .byte 1 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Worker; Reserved x2 146*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .byte 0 147*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .short 0 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Worker; # functions: 150*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 5 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Worker; FunctionAddr: 153*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .quad _imp_null_check_add_result 154*9880d681SAndroid Build Coastguard Worker; NumFaultingPCs 155*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 1 156*9880d681SAndroid Build Coastguard Worker; Reserved: 157*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 0 158*9880d681SAndroid Build Coastguard Worker; Fault[0].Type: 159*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 1 160*9880d681SAndroid Build Coastguard Worker; Fault[0].FaultOffset: 161*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long [[BB0_imp_null_check_add_result]]-_imp_null_check_add_result 162*9880d681SAndroid Build Coastguard Worker; Fault[0].HandlerOffset: 163*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long [[BB1_imp_null_check_add_result]]-_imp_null_check_add_result 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Worker; FunctionAddr: 166*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .quad _imp_null_check_gep_load 167*9880d681SAndroid Build Coastguard Worker; NumFaultingPCs 168*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 1 169*9880d681SAndroid Build Coastguard Worker; Reserved: 170*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 0 171*9880d681SAndroid Build Coastguard Worker; Fault[0].Type: 172*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 1 173*9880d681SAndroid Build Coastguard Worker; Fault[0].FaultOffset: 174*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long [[BB0_imp_null_check_gep_load]]-_imp_null_check_gep_load 175*9880d681SAndroid Build Coastguard Worker; Fault[0].HandlerOffset: 176*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long [[BB1_imp_null_check_gep_load]]-_imp_null_check_gep_load 177*9880d681SAndroid Build Coastguard Worker 178*9880d681SAndroid Build Coastguard Worker; FunctionAddr: 179*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .quad _imp_null_check_hoist_over_unrelated_load 180*9880d681SAndroid Build Coastguard Worker; NumFaultingPCs 181*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 1 182*9880d681SAndroid Build Coastguard Worker; Reserved: 183*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 0 184*9880d681SAndroid Build Coastguard Worker; Fault[0].Type: 185*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 1 186*9880d681SAndroid Build Coastguard Worker; Fault[0].FaultOffset: 187*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long [[BB0_imp_null_check_hoist_over_unrelated_load]]-_imp_null_check_hoist_over_unrelated_load 188*9880d681SAndroid Build Coastguard Worker; Fault[0].HandlerOffset: 189*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long [[BB1_imp_null_check_hoist_over_unrelated_load]]-_imp_null_check_hoist_over_unrelated_load 190*9880d681SAndroid Build Coastguard Worker 191*9880d681SAndroid Build Coastguard Worker; FunctionAddr: 192*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .quad _imp_null_check_load 193*9880d681SAndroid Build Coastguard Worker; NumFaultingPCs 194*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 1 195*9880d681SAndroid Build Coastguard Worker; Reserved: 196*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 0 197*9880d681SAndroid Build Coastguard Worker; Fault[0].Type: 198*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 1 199*9880d681SAndroid Build Coastguard Worker; Fault[0].FaultOffset: 200*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long [[BB0_imp_null_check_load]]-_imp_null_check_load 201*9880d681SAndroid Build Coastguard Worker; Fault[0].HandlerOffset: 202*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long [[BB1_imp_null_check_load]]-_imp_null_check_load 203*9880d681SAndroid Build Coastguard Worker 204*9880d681SAndroid Build Coastguard Worker; FunctionAddr: 205*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .quad _imp_null_check_via_mem_comparision 206*9880d681SAndroid Build Coastguard Worker; NumFaultingPCs 207*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 1 208*9880d681SAndroid Build Coastguard Worker; Reserved: 209*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 0 210*9880d681SAndroid Build Coastguard Worker; Fault[0].Type: 211*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 1 212*9880d681SAndroid Build Coastguard Worker; Fault[0].FaultOffset: 213*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long [[BB0_imp_null_check_via_mem_comparision]]-_imp_null_check_via_mem_comparision 214*9880d681SAndroid Build Coastguard Worker; Fault[0].HandlerOffset: 215*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long [[BB1_imp_null_check_via_mem_comparision]]-_imp_null_check_via_mem_comparision 216*9880d681SAndroid Build Coastguard Worker 217*9880d681SAndroid Build Coastguard Worker; OBJDUMP: FaultMap table: 218*9880d681SAndroid Build Coastguard Worker; OBJDUMP-NEXT: Version: 0x1 219*9880d681SAndroid Build Coastguard Worker; OBJDUMP-NEXT: NumFunctions: 5 220*9880d681SAndroid Build Coastguard Worker; OBJDUMP-NEXT: FunctionAddress: 0x000000, NumFaultingPCs: 1 221*9880d681SAndroid Build Coastguard Worker; OBJDUMP-NEXT: Fault kind: FaultingLoad, faulting PC offset: 0, handling PC offset: 5 222*9880d681SAndroid Build Coastguard Worker; OBJDUMP-NEXT: FunctionAddress: 0x000000, NumFaultingPCs: 1 223*9880d681SAndroid Build Coastguard Worker; OBJDUMP-NEXT: Fault kind: FaultingLoad, faulting PC offset: 0, handling PC offset: 7 224*9880d681SAndroid Build Coastguard Worker; OBJDUMP-NEXT: FunctionAddress: 0x000000, NumFaultingPCs: 1 225*9880d681SAndroid Build Coastguard Worker; OBJDUMP-NEXT: Fault kind: FaultingLoad, faulting PC offset: 0, handling PC offset: 7 226*9880d681SAndroid Build Coastguard Worker; OBJDUMP-NEXT: FunctionAddress: 0x000000, NumFaultingPCs: 1 227*9880d681SAndroid Build Coastguard Worker; OBJDUMP-NEXT: Fault kind: FaultingLoad, faulting PC offset: 0, handling PC offset: 3 228