1 ; Test lib call simplification of __strncpy_chk calls with various values
4 ; RUN: opt < %s -instcombine -S | FileCheck %s
6 target 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 @a = common global [60 x i8] zeroinitializer, align 1
9 @b = common global [60 x i8] zeroinitializer, align 1
10 @.str = private constant [12 x i8] c"abcdefghijk\00"
12 ; Check cases where dstlen >= len
14 define i8* @test_simplify1() {
15 ; CHECK-LABEL: @test_simplify1(
16 %dst = getelementptr inbounds [60 x i8], [60 x i8]* @a, i32 0, i32 0
17 %src = getelementptr inbounds [12 x i8], [12 x i8]* @.str, i32 0, i32 0
19 ; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 getelementptr inbounds ([60 x i8], [60 x i8]* @a, i32 0, i32 0), i8* align 1 getelementptr inbounds ([12 x i8], [12 x i8]* @.str, i32 0, i32 0), i32 12, i1 false)
20 ; CHECK-NEXT: ret i8* getelementptr inbounds ([60 x i8], [60 x i8]* @a, i32 0, i32 0)
21 %ret = call i8* @__strncpy_chk(i8* %dst, i8* %src, i32 12, i32 60)
25 define i8* @test_simplify2() {
26 ; CHECK-LABEL: @test_simplify2(
27 %dst = getelementptr inbounds [60 x i8], [60 x i8]* @a, i32 0, i32 0
28 %src = getelementptr inbounds [12 x i8], [12 x i8]* @.str, i32 0, i32 0
30 ; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 getelementptr inbounds ([60 x i8], [60 x i8]* @a, i32 0, i32 0), i8* align 1 getelementptr inbounds ([12 x i8], [12 x i8]* @.str, i32 0, i32 0), i32 12, i1 false)
31 ; CHECK-NEXT: ret i8* getelementptr inbounds ([60 x i8], [60 x i8]* @a, i32 0, i32 0)
32 %ret = call i8* @__strncpy_chk(i8* %dst, i8* %src, i32 12, i32 12)
36 define i8* @test_simplify3() {
37 ; CHECK-LABEL: @test_simplify3(
38 %dst = getelementptr inbounds [60 x i8], [60 x i8]* @a, i32 0, i32 0
39 %src = getelementptr inbounds [60 x i8], [60 x i8]* @b, i32 0, i32 0
41 ; CHECK-NEXT: %strncpy = call i8* @strncpy(i8* getelementptr inbounds ([60 x i8], [60 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([60 x i8], [60 x i8]* @b, i32 0, i32 0), i32 12)
42 ; CHECK-NEXT: ret i8* %strncpy
43 %ret = call i8* @__strncpy_chk(i8* %dst, i8* %src, i32 12, i32 60)
47 ; Check cases where dstlen < len
49 define i8* @test_no_simplify1() {
50 ; CHECK-LABEL: @test_no_simplify1(
51 %dst = getelementptr inbounds [60 x i8], [60 x i8]* @a, i32 0, i32 0
52 %src = getelementptr inbounds [12 x i8], [12 x i8]* @.str, i32 0, i32 0
54 ; CHECK-NEXT: %ret = call i8* @__strncpy_chk(i8* getelementptr inbounds ([60 x i8], [60 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str, i32 0, i32 0), i32 8, i32 4)
55 ; CHECK-NEXT: ret i8* %ret
56 %ret = call i8* @__strncpy_chk(i8* %dst, i8* %src, i32 8, i32 4)
60 define i8* @test_no_simplify2() {
61 ; CHECK-LABEL: @test_no_simplify2(
62 %dst = getelementptr inbounds [60 x i8], [60 x i8]* @a, i32 0, i32 0
63 %src = getelementptr inbounds [60 x i8], [60 x i8]* @b, i32 0, i32 0
65 ; CHECK-NEXT: %ret = call i8* @__strncpy_chk(i8* getelementptr inbounds ([60 x i8], [60 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([60 x i8], [60 x i8]* @b, i32 0, i32 0), i32 8, i32 0)
66 ; CHECK-NEXT: ret i8* %ret
67 %ret = call i8* @__strncpy_chk(i8* %dst, i8* %src, i32 8, i32 0)
71 declare i8* @__strncpy_chk(i8*, i8*, i32, i32)