1*4e89d119SYingwei Zheng; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 2*4e89d119SYingwei Zheng; RUN: opt -S -passes=instcombine < %s | FileCheck %s 3*4e89d119SYingwei Zheng 4*4e89d119SYingwei Zhengdefine void @memset_null(i64 %len) { 5*4e89d119SYingwei Zheng; CHECK-LABEL: define void @memset_null( 6*4e89d119SYingwei Zheng; CHECK-SAME: i64 [[LEN:%.*]]) { 7*4e89d119SYingwei Zheng; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[LEN]], 0 8*4e89d119SYingwei Zheng; CHECK-NEXT: call void @llvm.assume(i1 [[TMP1]]) 9*4e89d119SYingwei Zheng; CHECK-NEXT: ret void 10*4e89d119SYingwei Zheng; 11*4e89d119SYingwei Zheng call void @llvm.memset.p0.i64(ptr null, i8 0, i64 %len, i1 false) 12*4e89d119SYingwei Zheng ret void 13*4e89d119SYingwei Zheng} 14*4e89d119SYingwei Zheng 15*4e89d119SYingwei Zhengdefine void @memset_null_ub() { 16*4e89d119SYingwei Zheng; CHECK-LABEL: define void @memset_null_ub() { 17*4e89d119SYingwei Zheng; CHECK-NEXT: store i64 poison, ptr null, align 4294967296 18*4e89d119SYingwei Zheng; CHECK-NEXT: ret void 19*4e89d119SYingwei Zheng; 20*4e89d119SYingwei Zheng call void @llvm.memset.p0.i64(ptr null, i8 0, i64 8, i1 false) 21*4e89d119SYingwei Zheng ret void 22*4e89d119SYingwei Zheng} 23*4e89d119SYingwei Zheng 24*4e89d119SYingwei Zhengdefine void @memcpy_null_src(ptr %dst, i64 %len) { 25*4e89d119SYingwei Zheng; CHECK-LABEL: define void @memcpy_null_src( 26*4e89d119SYingwei Zheng; CHECK-SAME: ptr [[DST:%.*]], i64 [[LEN:%.*]]) { 27*4e89d119SYingwei Zheng; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[LEN]], 0 28*4e89d119SYingwei Zheng; CHECK-NEXT: call void @llvm.assume(i1 [[TMP1]]) 29*4e89d119SYingwei Zheng; CHECK-NEXT: ret void 30*4e89d119SYingwei Zheng; 31*4e89d119SYingwei Zheng call void @llvm.memcpy.p0.i64(ptr %dst, ptr null, i64 %len, i1 false) 32*4e89d119SYingwei Zheng ret void 33*4e89d119SYingwei Zheng} 34*4e89d119SYingwei Zheng 35*4e89d119SYingwei Zhengdefine void @memmove_null_src(ptr %dst, i64 %len) { 36*4e89d119SYingwei Zheng; CHECK-LABEL: define void @memmove_null_src( 37*4e89d119SYingwei Zheng; CHECK-SAME: ptr [[DST:%.*]], i64 [[LEN:%.*]]) { 38*4e89d119SYingwei Zheng; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[LEN]], 0 39*4e89d119SYingwei Zheng; CHECK-NEXT: call void @llvm.assume(i1 [[TMP1]]) 40*4e89d119SYingwei Zheng; CHECK-NEXT: ret void 41*4e89d119SYingwei Zheng; 42*4e89d119SYingwei Zheng call void @llvm.memmove.p0.i64(ptr %dst, ptr null, i64 %len, i1 false) 43*4e89d119SYingwei Zheng ret void 44*4e89d119SYingwei Zheng} 45*4e89d119SYingwei Zheng 46*4e89d119SYingwei Zhengdefine void @memset_element_atomic(i64 %len) { 47*4e89d119SYingwei Zheng; CHECK-LABEL: define void @memset_element_atomic( 48*4e89d119SYingwei Zheng; CHECK-SAME: i64 [[LEN:%.*]]) { 49*4e89d119SYingwei Zheng; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[LEN]], 0 50*4e89d119SYingwei Zheng; CHECK-NEXT: call void @llvm.assume(i1 [[TMP1]]) 51*4e89d119SYingwei Zheng; CHECK-NEXT: ret void 52*4e89d119SYingwei Zheng; 53*4e89d119SYingwei Zheng call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 1 null, i8 0, i64 %len, i32 1) 54*4e89d119SYingwei Zheng ret void 55*4e89d119SYingwei Zheng} 56*4e89d119SYingwei Zheng 57*4e89d119SYingwei Zheng; negative tests 58*4e89d119SYingwei Zheng 59*4e89d119SYingwei Zhengdefine void @memset_null_volatile(i64 %len) { 60*4e89d119SYingwei Zheng; CHECK-LABEL: define void @memset_null_volatile( 61*4e89d119SYingwei Zheng; CHECK-SAME: i64 [[LEN:%.*]]) { 62*4e89d119SYingwei Zheng; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr null, i8 0, i64 [[LEN]], i1 true) 63*4e89d119SYingwei Zheng; CHECK-NEXT: ret void 64*4e89d119SYingwei Zheng; 65*4e89d119SYingwei Zheng call void @llvm.memset.p0.i64(ptr null, i8 0, i64 %len, i1 true) 66*4e89d119SYingwei Zheng ret void 67*4e89d119SYingwei Zheng} 68*4e89d119SYingwei Zheng 69*4e89d119SYingwei Zhengdefine void @memset_null_is_defined(i64 %len) null_pointer_is_valid { 70*4e89d119SYingwei Zheng; CHECK-LABEL: define void @memset_null_is_defined( 71*4e89d119SYingwei Zheng; CHECK-SAME: i64 [[LEN:%.*]]) #[[ATTR0:[0-9]+]] { 72*4e89d119SYingwei Zheng; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 4294967296 null, i8 0, i64 [[LEN]], i1 false) 73*4e89d119SYingwei Zheng; CHECK-NEXT: ret void 74*4e89d119SYingwei Zheng; 75*4e89d119SYingwei Zheng call void @llvm.memset.p0.i64(ptr null, i8 0, i64 %len, i1 false) 76*4e89d119SYingwei Zheng ret void 77*4e89d119SYingwei Zheng} 78