xref: /llvm-project/llvm/test/Transforms/InstCombine/mem-intrinsics.ll (revision 4e89d1199c180fd384486ba2796368ec800180ee)
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