xref: /llvm-project/llvm/test/Transforms/InstCombine/stpcpy-1.ll (revision 23a239267e8a1d20ed10d3545feaf2a2bb70b085)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; Test that the stpcpy library call simplifier works correctly.
3; RUN: opt < %s -passes=instcombine -S | FileCheck %s
4;
5; This transformation requires the pointer size, as it assumes that size_t is
6; the size of a pointer.
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-n8:16:32"
8
9@hello = constant [6 x i8] c"hello\00"
10@a = common global [32 x i8] zeroinitializer, align 1
11@b = common global [32 x i8] zeroinitializer, align 1
12@percent_s = constant [3 x i8] c"%s\00"
13
14declare ptr @stpcpy(ptr, ptr)
15
16define ptr @test_simplify1() {
17; CHECK-LABEL: @test_simplify1(
18; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i32(ptr noundef nonnull align 1 dereferenceable(6) @a, ptr noundef nonnull align 1 dereferenceable(6) @hello, i32 6, i1 false)
19; CHECK-NEXT:    ret ptr getelementptr inbounds nuw (i8, ptr @a, i32 5)
20;
21  %ret = call ptr @stpcpy(ptr @a, ptr @hello)
22  ret ptr %ret
23}
24
25define ptr @test_simplify2() {
26; CHECK-LABEL: @test_simplify2(
27; CHECK-NEXT:    [[STRLEN:%.*]] = call i32 @strlen(ptr noundef nonnull dereferenceable(1) @a)
28; CHECK-NEXT:    [[RET:%.*]] = getelementptr inbounds i8, ptr @a, i32 [[STRLEN]]
29; CHECK-NEXT:    ret ptr [[RET]]
30;
31  %ret = call ptr @stpcpy(ptr @a, ptr @a)
32  ret ptr %ret
33}
34
35define void @test_simplify3(ptr %dst) {
36; CHECK-LABEL: @test_simplify3(
37; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i32(ptr noundef nonnull align 1 dereferenceable(6) [[DST:%.*]], ptr noundef nonnull align 1 dereferenceable(6) @hello, i32 6, i1 false)
38; CHECK-NEXT:    ret void
39;
40  call ptr @stpcpy(ptr dereferenceable(80) %dst, ptr @hello)
41  ret void
42}
43
44define ptr @test_no_simplify1() {
45; CHECK-LABEL: @test_no_simplify1(
46; CHECK-NEXT:    [[RET:%.*]] = call ptr @stpcpy(ptr nonnull @a, ptr nonnull @b)
47; CHECK-NEXT:    ret ptr [[RET]]
48;
49  %ret = call ptr @stpcpy(ptr @a, ptr @b)
50  ret ptr %ret
51}
52
53define ptr @test_no_simplify2(ptr %dst, ptr %src) {
54; CHECK-LABEL: @test_no_simplify2(
55; CHECK-NEXT:    [[RET:%.*]] = musttail call ptr @stpcpy(ptr [[DST:%.*]], ptr [[SRC:%.*]])
56; CHECK-NEXT:    ret ptr [[RET]]
57;
58  %ret = musttail call ptr @stpcpy(ptr %dst, ptr %src)
59  ret ptr %ret
60}
61
62define ptr @test_no_incompatible_attr() {
63; CHECK-LABEL: @test_no_incompatible_attr(
64; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i32(ptr noundef nonnull align 1 dereferenceable(6) @a, ptr noundef nonnull align 1 dereferenceable(6) @hello, i32 6, i1 false)
65; CHECK-NEXT:    ret ptr getelementptr inbounds nuw (i8, ptr @a, i32 5)
66;
67  %ret = call dereferenceable(1) ptr @stpcpy(ptr @a, ptr @hello)
68  ret ptr %ret
69}
70