xref: /llvm-project/llvm/test/Transforms/InstCombine/memmove_chk-1.ll (revision fcfc31fffb9a83416453e60bd0dff2df93c2ee20)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; Test lib call simplification of __memmove_chk calls with various values
3; for dstlen and len.
4;
5; RUN: opt < %s -passes=instcombine -S | FileCheck %s
6
7target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
8
9%struct.T1 = type { [100 x i32], [100 x i32], [1024 x i8] }
10%struct.T2 = type { [100 x i32], [100 x i32], [1024 x i8] }
11%struct.T3 = type { [100 x i32], [100 x i32], [2048 x i8] }
12
13@t1 = common global %struct.T1 zeroinitializer
14@t2 = common global %struct.T2 zeroinitializer
15@t3 = common global %struct.T3 zeroinitializer
16
17; Check cases where dstlen >= len.
18
19define ptr @test_simplify1() {
20; CHECK-LABEL: @test_simplify1(
21; CHECK-NEXT:    call void @llvm.memmove.p0.p0.i64(ptr noundef nonnull align 4 dereferenceable(1824) @t1, ptr noundef nonnull align 4 dereferenceable(1824) @t2, i64 1824, i1 false)
22; CHECK-NEXT:    ret ptr @t1
23;
24
25  %ret = call ptr @__memmove_chk(ptr @t1, ptr @t2, i64 1824, i64 1824)
26  ret ptr %ret
27}
28
29define ptr @test_simplify2() {
30; CHECK-LABEL: @test_simplify2(
31; CHECK-NEXT:    call void @llvm.memmove.p0.p0.i64(ptr noundef nonnull align 4 dereferenceable(1824) @t1, ptr noundef nonnull align 4 dereferenceable(1824) @t3, i64 1824, i1 false)
32; CHECK-NEXT:    ret ptr @t1
33;
34
35  %ret = call ptr @__memmove_chk(ptr @t1, ptr @t3, i64 1824, i64 2848)
36  ret ptr %ret
37}
38
39define ptr @test_simplify3() {
40; CHECK-LABEL: @test_simplify3(
41; CHECK-NEXT:    tail call void @llvm.memmove.p0.p0.i64(ptr noundef nonnull align 4 dereferenceable(1824) @t1, ptr noundef nonnull align 4 dereferenceable(1824) @t2, i64 1824, i1 false)
42; CHECK-NEXT:    ret ptr @t1
43;
44
45  %ret = tail call ptr @__memmove_chk(ptr @t1, ptr @t2, i64 1824, i64 1824)
46  ret ptr %ret
47}
48
49; Check cases where dstlen < len.
50
51define ptr @test_no_simplify1() {
52; CHECK-LABEL: @test_no_simplify1(
53; CHECK-NEXT:    [[RET:%.*]] = call ptr @__memmove_chk(ptr nonnull @t3, ptr nonnull @t1, i64 2848, i64 1824)
54; CHECK-NEXT:    ret ptr [[RET]]
55;
56
57  %ret = call ptr @__memmove_chk(ptr @t3, ptr @t1, i64 2848, i64 1824)
58  ret ptr %ret
59}
60
61define ptr @test_no_simplify2() {
62; CHECK-LABEL: @test_no_simplify2(
63; CHECK-NEXT:    [[RET:%.*]] = call ptr @__memmove_chk(ptr nonnull @t1, ptr nonnull @t2, i64 1024, i64 0)
64; CHECK-NEXT:    ret ptr [[RET]]
65;
66
67  %ret = call ptr @__memmove_chk(ptr @t1, ptr @t2, i64 1024, i64 0)
68  ret ptr %ret
69}
70
71define ptr @test_no_simplify3(ptr %dst, ptr %src, i64 %a, i64 %b) {
72; CHECK-LABEL: @test_no_simplify3(
73; CHECK-NEXT:    [[RET:%.*]] = musttail call ptr @__memmove_chk(ptr [[DST:%.*]], ptr [[SRC:%.*]], i64 1824, i64 1824)
74; CHECK-NEXT:    ret ptr [[RET]]
75;
76  %ret = musttail call ptr @__memmove_chk(ptr %dst, ptr %src, i64 1824, i64 1824)
77  ret ptr %ret
78}
79
80define ptr @test_no_incompatible_attr(ptr %mem, i32 %val, i32 %size) {
81; CHECK-LABEL: @test_no_incompatible_attr(
82; CHECK-NEXT:    call void @llvm.memmove.p0.p0.i64(ptr noundef nonnull align 4 dereferenceable(1824) @t1, ptr noundef nonnull align 4 dereferenceable(1824) @t2, i64 1824, i1 false)
83; CHECK-NEXT:    ret ptr @t1
84;
85
86  %ret = call dereferenceable(1) ptr @__memmove_chk(ptr @t1, ptr @t2, i64 1824, i64 1824)
87  ret ptr %ret
88}
89
90declare ptr @__memmove_chk(ptr, ptr, i64, i64)
91