| // Check that null pointer checks are not optimized out if -fms-compatibility is set |
| // RUN: %clang_cc1 -fms-kernel -O2 -triple x86_64-pc-windows-msvc %s -emit-llvm -o - | FileCheck %s |
| // RUN: %clang_cc1 -O2 -triple x86_64-pc-windows-msvc %s -emit-llvm -o - | FileCheck %s --check-prefix=NOCHECK |
| // RUN: %clang_cc1 -fms-kernel -O2 -triple x86_64-pc-windows-msvc -fdelete-null-pointer-checks %s -emit-llvm -o - | FileCheck %s --check-prefix=NOCHECK |
| // RUN: %clang_cc1 -O2 -triple x86_64-pc-windows-msvc -fdelete-null-pointer-checks -fms-kernel %s -emit-llvm -o - | FileCheck %s --check-prefix=NOCHECK |
| |
| // CHECK-LABEL: i32 @process |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: %tobool.not = icmp eq ptr %p, null |
| // CHECK-NEXT: br i1 %tobool.not, label %cleanup, label %if.end |
| |
| // CHECK-LABEL: ptr @call_memcpy |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64 |
| // CHECK-NEXT: ret ptr null |
| |
| |
| // NOCHECK-LABEL: i32 @process |
| // NOCHECK-NOT: icmp eq ptr %p, null |
| |
| // NOCHECK-LABEL: ptr @call_memcpy |
| // NOCHECK-NEXT: entry: |
| // NOCHECK-NEXT: ret ptr null |
| |
| struct Obj { int value; int extra; }; |
| |
| int process(struct Obj* p) { |
| int v = p->value; |
| if (!p) |
| return -1; |
| return v + p->extra; |
| } |
| |
| void* call_memcpy(void* p, long long size) { |
| return __builtin_memcpy(0, p, size); |
| } |