1; RUN: llc -O3 -mtriple=x86_64-apple-macosx -enable-implicit-null-checks < %s | FileCheck %s 2 3; RUN: llc < %s -mtriple=x86_64-apple-macosx -enable-implicit-null-checks \ 4; RUN: | llvm-mc -triple x86_64-apple-macosx -filetype=obj -o - \ 5; RUN: | llvm-objdump -triple x86_64-apple-macosx -fault-map-section - \ 6; RUN: | FileCheck %s -check-prefix OBJDUMP 7 8; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -enable-implicit-null-checks \ 9; RUN: | llvm-mc -triple x86_64-unknown-linux-gnu -filetype=obj -o - \ 10; RUN: | llvm-objdump -triple x86_64-unknown-linux-gnu -fault-map-section - \ 11; RUN: | FileCheck %s -check-prefix OBJDUMP 12 13define i32 @imp_null_check_load(i32* %x) { 14; CHECK-LABEL: _imp_null_check_load: 15; CHECK: Ltmp1: 16; CHECK: movl (%rdi), %eax 17; CHECK: retq 18; CHECK: Ltmp0: 19; CHECK: movl $42, %eax 20; CHECK: retq 21 22 entry: 23 %c = icmp eq i32* %x, null 24 br i1 %c, label %is_null, label %not_null, !make.implicit !0 25 26 is_null: 27 ret i32 42 28 29 not_null: 30 %t = load i32, i32* %x 31 ret i32 %t 32} 33 34define i32 @imp_null_check_gep_load(i32* %x) { 35; CHECK-LABEL: _imp_null_check_gep_load: 36; CHECK: Ltmp3: 37; CHECK: movl 128(%rdi), %eax 38; CHECK: retq 39; CHECK: Ltmp2: 40; CHECK: movl $42, %eax 41; CHECK: retq 42 43 entry: 44 %c = icmp eq i32* %x, null 45 br i1 %c, label %is_null, label %not_null, !make.implicit !0 46 47 is_null: 48 ret i32 42 49 50 not_null: 51 %x.gep = getelementptr i32, i32* %x, i32 32 52 %t = load i32, i32* %x.gep 53 ret i32 %t 54} 55 56define i32 @imp_null_check_add_result(i32* %x, i32 %p) { 57; CHECK-LABEL: _imp_null_check_add_result: 58; CHECK: Ltmp5: 59; CHECK: addl (%rdi), %esi 60; CHECK: movl %esi, %eax 61; CHECK: retq 62; CHECK: Ltmp4: 63; CHECK: movl $42, %eax 64; CHECK: retq 65 66 entry: 67 %c = icmp eq i32* %x, null 68 br i1 %c, label %is_null, label %not_null, !make.implicit !0 69 70 is_null: 71 ret i32 42 72 73 not_null: 74 %t = load i32, i32* %x 75 %p1 = add i32 %t, %p 76 ret i32 %p1 77} 78 79define i32 @imp_null_check_hoist_over_unrelated_load(i32* %x, i32* %y, i32* %z) { 80; CHECK-LABEL: _imp_null_check_hoist_over_unrelated_load: 81; CHECK: Ltmp7: 82; CHECK: movl (%rdi), %eax 83; CHECK: movl (%rsi), %ecx 84; CHECK: movl %ecx, (%rdx) 85; CHECK: retq 86; CHECK: Ltmp6: 87; CHECK: movl $42, %eax 88; CHECK: retq 89 90 entry: 91 %c = icmp eq i32* %x, null 92 br i1 %c, label %is_null, label %not_null, !make.implicit !0 93 94 is_null: 95 ret i32 42 96 97 not_null: 98 %t0 = load i32, i32* %y 99 %t1 = load i32, i32* %x 100 store i32 %t0, i32* %z 101 ret i32 %t1 102} 103 104!0 = !{} 105 106; CHECK-LABEL: __LLVM_FaultMaps: 107 108; Version: 109; CHECK-NEXT: .byte 1 110 111; Reserved x2 112; CHECK-NEXT: .byte 0 113; CHECK-NEXT: .short 0 114 115; # functions: 116; CHECK-NEXT: .long 4 117 118; FunctionAddr: 119; CHECK-NEXT: .quad _imp_null_check_add_result 120; NumFaultingPCs 121; CHECK-NEXT: .long 1 122; Reserved: 123; CHECK-NEXT: .long 0 124; Fault[0].Type: 125; CHECK-NEXT: .long 1 126; Fault[0].FaultOffset: 127; CHECK-NEXT: .long Ltmp5-_imp_null_check_add_result 128; Fault[0].HandlerOffset: 129; CHECK-NEXT: .long Ltmp4-_imp_null_check_add_result 130 131; FunctionAddr: 132; CHECK-NEXT: .quad _imp_null_check_gep_load 133; NumFaultingPCs 134; CHECK-NEXT: .long 1 135; Reserved: 136; CHECK-NEXT: .long 0 137; Fault[0].Type: 138; CHECK-NEXT: .long 1 139; Fault[0].FaultOffset: 140; CHECK-NEXT: .long Ltmp3-_imp_null_check_gep_load 141; Fault[0].HandlerOffset: 142; CHECK-NEXT: .long Ltmp2-_imp_null_check_gep_load 143 144; FunctionAddr: 145; CHECK-NEXT: .quad _imp_null_check_hoist_over_unrelated_load 146; NumFaultingPCs 147; CHECK-NEXT: .long 1 148; Reserved: 149; CHECK-NEXT: .long 0 150; Fault[0].Type: 151; CHECK-NEXT: .long 1 152; Fault[0].FaultOffset: 153; CHECK-NEXT: .long Ltmp7-_imp_null_check_hoist_over_unrelated_load 154; Fault[0].HandlerOffset: 155; CHECK-NEXT: .long Ltmp6-_imp_null_check_hoist_over_unrelated_load 156 157; FunctionAddr: 158; CHECK-NEXT: .quad _imp_null_check_load 159; NumFaultingPCs 160; CHECK-NEXT: .long 1 161; Reserved: 162; CHECK-NEXT: .long 0 163; Fault[0].Type: 164; CHECK-NEXT: .long 1 165; Fault[0].FaultOffset: 166; CHECK-NEXT: .long Ltmp1-_imp_null_check_load 167; Fault[0].HandlerOffset: 168; CHECK-NEXT: .long Ltmp0-_imp_null_check_load 169 170; OBJDUMP: FaultMap table: 171; OBJDUMP-NEXT: Version: 0x1 172; OBJDUMP-NEXT: NumFunctions: 4 173; OBJDUMP-NEXT: FunctionAddress: 0x000000, NumFaultingPCs: 1 174; OBJDUMP-NEXT: Fault kind: FaultingLoad, faulting PC offset: 0, handling PC offset: 5 175; OBJDUMP-NEXT: FunctionAddress: 0x000000, NumFaultingPCs: 1 176; OBJDUMP-NEXT: Fault kind: FaultingLoad, faulting PC offset: 0, handling PC offset: 7 177; OBJDUMP-NEXT: FunctionAddress: 0x000000, NumFaultingPCs: 1 178; OBJDUMP-NEXT: Fault kind: FaultingLoad, faulting PC offset: 0, handling PC offset: 7 179; OBJDUMP-NEXT: FunctionAddress: 0x000000, NumFaultingPCs: 1 180; OBJDUMP-NEXT: Fault kind: FaultingLoad, faulting PC offset: 0, handling PC offset: 3 181