xref: /llvm-project/llvm/test/Transforms/InstCombine/strncpy_chk-1.ll (revision dc2b66b8d6032dbc5e5dd7ee86e4fa7dd9cf0b9b)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; Test lib call simplification of __strncpy_chk calls with various values
3; for len and dstlen.
4;
5; RUN: opt < %s -passes=instcombine -S | FileCheck %s
6
7target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
8
9@a = common global [60 x i8] zeroinitializer, align 1
10@b = common global [60 x i8] zeroinitializer, align 1
11@.str = private constant [12 x i8] c"abcdefghijk\00"
12
13; Check cases where dstlen >= len
14
15define ptr @test_simplify1() {
16; CHECK-LABEL: @test_simplify1(
17; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i32(ptr noundef nonnull align 1 dereferenceable(12) @a, ptr noundef nonnull align 1 dereferenceable(12) @.str, i32 12, i1 false)
18; CHECK-NEXT:    ret ptr @a
19;
20
21  %ret = call ptr @__strncpy_chk(ptr @a, ptr @.str, i32 12, i32 60)
22  ret ptr %ret
23}
24
25define ptr @test_simplify2() {
26; CHECK-LABEL: @test_simplify2(
27; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i32(ptr noundef nonnull align 1 dereferenceable(12) @a, ptr noundef nonnull align 1 dereferenceable(12) @.str, i32 12, i1 false)
28; CHECK-NEXT:    ret ptr @a
29;
30
31  %ret = call ptr @__strncpy_chk(ptr @a, ptr @.str, i32 12, i32 12)
32  ret ptr %ret
33}
34
35define ptr @test_simplify3() {
36; CHECK-LABEL: @test_simplify3(
37; CHECK-NEXT:    [[STRNCPY:%.*]] = call ptr @strncpy(ptr noundef nonnull dereferenceable(1) @a, ptr noundef nonnull dereferenceable(1) @b, i32 12)
38; CHECK-NEXT:    ret ptr @a
39;
40
41  %ret = call ptr @__strncpy_chk(ptr @a, ptr @b, i32 12, i32 60)
42  ret ptr %ret
43}
44
45; Check cases where dstlen < len
46
47define ptr @test_no_simplify1() {
48; CHECK-LABEL: @test_no_simplify1(
49; CHECK-NEXT:    [[RET:%.*]] = call ptr @__strncpy_chk(ptr nonnull @a, ptr nonnull @.str, i32 8, i32 4)
50; CHECK-NEXT:    ret ptr [[RET]]
51;
52
53  %ret = call ptr @__strncpy_chk(ptr @a, ptr @.str, i32 8, i32 4)
54  ret ptr %ret
55}
56
57define ptr @test_no_simplify2() {
58; CHECK-LABEL: @test_no_simplify2(
59; CHECK-NEXT:    [[RET:%.*]] = call ptr @__strncpy_chk(ptr nonnull @a, ptr nonnull @b, i32 8, i32 0)
60; CHECK-NEXT:    ret ptr [[RET]]
61;
62
63  %ret = call ptr @__strncpy_chk(ptr @a, ptr @b, i32 8, i32 0)
64  ret ptr %ret
65}
66
67declare ptr @__strncpy_chk(ptr, ptr, i32, i32)
68