1; Test lib call simplification of __memmove_chk calls with various values
2; for dstlen and len.
3;
4; RUN: opt < %s -instcombine -S | FileCheck %s
5
6target 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"
7
8%struct.T1 = type { [100 x i32], [100 x i32], [1024 x i8] }
9%struct.T2 = type { [100 x i32], [100 x i32], [1024 x i8] }
10%struct.T3 = type { [100 x i32], [100 x i32], [2048 x i8] }
11
12@t1 = common global %struct.T1 zeroinitializer
13@t2 = common global %struct.T2 zeroinitializer
14@t3 = common global %struct.T3 zeroinitializer
15
16; Check cases where dstlen >= len.
17
18define void @test_simplify1() {
19; CHECK-LABEL: @test_simplify1(
20  %dst = bitcast %struct.T1* @t1 to i8*
21  %src = bitcast %struct.T2* @t2 to i8*
22
23; CHECK-NEXT: call void @llvm.memmove.p0i8.p0i8.i64
24  call i8* @__memmove_chk(i8* %dst, i8* %src, i64 1824, i64 1824)
25  ret void
26}
27
28define void @test_simplify2() {
29; CHECK-LABEL: @test_simplify2(
30  %dst = bitcast %struct.T1* @t1 to i8*
31  %src = bitcast %struct.T3* @t3 to i8*
32
33; CHECK-NEXT: call void @llvm.memmove.p0i8.p0i8.i64
34  call i8* @__memmove_chk(i8* %dst, i8* %src, i64 1824, i64 2848)
35  ret void
36}
37
38; Check cases where dstlen < len.
39
40define void @test_no_simplify1() {
41; CHECK-LABEL: @test_no_simplify1(
42  %dst = bitcast %struct.T3* @t3 to i8*
43  %src = bitcast %struct.T1* @t1 to i8*
44
45; CHECK-NEXT: call i8* @__memmove_chk
46  call i8* @__memmove_chk(i8* %dst, i8* %src, i64 2848, i64 1824)
47  ret void
48}
49
50define void @test_no_simplify2() {
51; CHECK-LABEL: @test_no_simplify2(
52  %dst = bitcast %struct.T1* @t1 to i8*
53  %src = bitcast %struct.T2* @t2 to i8*
54
55; CHECK-NEXT: call i8* @__memmove_chk
56  call i8* @__memmove_chk(i8* %dst, i8* %src, i64 1024, i64 0)
57  ret void
58}
59
60declare i8* @__memmove_chk(i8*, i8*, i64, i64)
61