1 ; RUN: llc %s -mtriple=arm64-apple-darwin -o - | \
2 ; RUN: FileCheck --check-prefix=CHECK-DARWIN --check-prefix=CHECK %s
3 ; RUN: llc %s -mtriple=arm64-linux-gnu -o - | \
4 ; RUN: FileCheck --check-prefix=CHECK-LINUX --check-prefix=CHECK %s
5 ; <rdar://problem/14199482> ARM64: Calls to bzero() replaced with calls to memset()
8 ; For small size (<= 256), we do not change memset to bzero.
10 define void @fct1(i8* nocapture %ptr) {
12 tail call void @llvm.memset.p0i8.i64(i8* %ptr, i8 0, i64 256, i32 1, i1 false)
16 declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1)
19 ; When the size is bigger than 256, change into bzero.
22 define void @fct2(i8* nocapture %ptr) {
24 tail call void @llvm.memset.p0i8.i64(i8* %ptr, i8 0, i64 257, i32 1, i1 false)
29 ; For unknown size, change to bzero.
32 define void @fct3(i8* nocapture %ptr, i32 %unknown) {
34 %conv = sext i32 %unknown to i64
35 tail call void @llvm.memset.p0i8.i64(i8* %ptr, i8 0, i64 %conv, i32 1, i1 false)
40 ; Size <= 256, no change.
42 define void @fct4(i8* %ptr) {
44 %tmp = tail call i64 @llvm.objectsize.i64(i8* %ptr, i1 false)
45 %call = tail call i8* @__memset_chk(i8* %ptr, i32 0, i64 256, i64 %tmp)
49 declare i8* @__memset_chk(i8*, i32, i64, i64)
51 declare i64 @llvm.objectsize.i64(i8*, i1)
57 define void @fct5(i8* %ptr) {
59 %tmp = tail call i64 @llvm.objectsize.i64(i8* %ptr, i1 false)
60 %call = tail call i8* @__memset_chk(i8* %ptr, i32 0, i64 257, i64 %tmp)
65 ; Size = unknown, change.
68 define void @fct6(i8* %ptr, i32 %unknown) {
70 %conv = sext i32 %unknown to i64
71 %tmp = tail call i64 @llvm.objectsize.i64(i8* %ptr, i1 false)
72 %call = tail call i8* @__memset_chk(i8* %ptr, i32 0, i64 %conv, i64 %tmp)
76 ; Next functions check that memset is not turned into bzero
77 ; when the set constant is non-zero, whatever the given size.
80 ; memset with something that is not a zero, no change.
82 define void @fct7(i8* %ptr) {
84 %tmp = tail call i64 @llvm.objectsize.i64(i8* %ptr, i1 false)
85 %call = tail call i8* @__memset_chk(i8* %ptr, i32 1, i64 256, i64 %tmp)
90 ; memset with something that is not a zero, no change.
92 define void @fct8(i8* %ptr) {
94 %tmp = tail call i64 @llvm.objectsize.i64(i8* %ptr, i1 false)
95 %call = tail call i8* @__memset_chk(i8* %ptr, i32 1, i64 257, i64 %tmp)
100 ; memset with something that is not a zero, no change.
102 define void @fct9(i8* %ptr, i32 %unknown) {
104 %conv = sext i32 %unknown to i64
105 %tmp = tail call i64 @llvm.objectsize.i64(i8* %ptr, i1 false)
106 %call = tail call i8* @__memset_chk(i8* %ptr, i32 1, i64 %conv, i64 %tmp)