ARM64: initial backend import
[oota-llvm.git] / test / CodeGen / ARM64 / memset-to-bzero.ll
1 ; RUN: llc %s -march arm64 -o - | FileCheck %s
2 ; <rdar://problem/14199482> ARM64: Calls to bzero() replaced with calls to memset()
3
4 ; CHECK: @fct1
5 ; For small size (<= 256), we do not change memset to bzero.
6 ; CHECK: memset
7 define void @fct1(i8* nocapture %ptr) {
8 entry:
9   tail call void @llvm.memset.p0i8.i64(i8* %ptr, i8 0, i64 256, i32 1, i1 false)
10   ret void
11 }
12
13 declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1)
14
15 ; CHECK: @fct2
16 ; When the size is bigger than 256, change into bzero.
17 ; CHECK: bzero
18 define void @fct2(i8* nocapture %ptr) {
19 entry:
20   tail call void @llvm.memset.p0i8.i64(i8* %ptr, i8 0, i64 257, i32 1, i1 false)
21   ret void
22 }
23
24 ; CHECK: @fct3
25 ; For unknown size, change to bzero.
26 ; CHECK: bzero
27 define void @fct3(i8* nocapture %ptr, i32 %unknown) {
28 entry:
29   %conv = sext i32 %unknown to i64
30   tail call void @llvm.memset.p0i8.i64(i8* %ptr, i8 0, i64 %conv, i32 1, i1 false)
31   ret void
32 }
33
34 ; CHECK: @fct4
35 ; Size <= 256, no change.
36 ; CHECK: memset
37 define void @fct4(i8* %ptr) {
38 entry:
39   %tmp = tail call i64 @llvm.objectsize.i64(i8* %ptr, i1 false)
40   %call = tail call i8* @__memset_chk(i8* %ptr, i32 0, i64 256, i64 %tmp)
41   ret void
42 }
43
44 declare i8* @__memset_chk(i8*, i32, i64, i64)
45
46 declare i64 @llvm.objectsize.i64(i8*, i1)
47
48 ; CHECK: @fct5
49 ; Size > 256, change.
50 ; CHECK: bzero
51 define void @fct5(i8* %ptr) {
52 entry:
53   %tmp = tail call i64 @llvm.objectsize.i64(i8* %ptr, i1 false)
54   %call = tail call i8* @__memset_chk(i8* %ptr, i32 0, i64 257, i64 %tmp)
55   ret void
56 }
57
58 ; CHECK: @fct6
59 ; Size = unknown, change.
60 ; CHECK: bzero
61 define void @fct6(i8* %ptr, i32 %unknown) {
62 entry:
63   %conv = sext i32 %unknown to i64
64   %tmp = tail call i64 @llvm.objectsize.i64(i8* %ptr, i1 false)
65   %call = tail call i8* @__memset_chk(i8* %ptr, i32 0, i64 %conv, i64 %tmp)
66   ret void
67 }
68
69 ; Next functions check that memset is not turned into bzero
70 ; when the set constant is non-zero, whatever the given size.
71
72 ; CHECK: @fct7
73 ; memset with something that is not a zero, no change.
74 ; CHECK: memset
75 define void @fct7(i8* %ptr) {
76 entry:
77   %tmp = tail call i64 @llvm.objectsize.i64(i8* %ptr, i1 false)
78   %call = tail call i8* @__memset_chk(i8* %ptr, i32 1, i64 256, i64 %tmp)
79   ret void
80 }
81
82 ; CHECK: @fct8
83 ; memset with something that is not a zero, no change.
84 ; CHECK: memset
85 define void @fct8(i8* %ptr) {
86 entry:
87   %tmp = tail call i64 @llvm.objectsize.i64(i8* %ptr, i1 false)
88   %call = tail call i8* @__memset_chk(i8* %ptr, i32 1, i64 257, i64 %tmp)
89   ret void
90 }
91
92 ; CHECK: @fct9
93 ; memset with something that is not a zero, no change.
94 ; CHECK: memset
95 define void @fct9(i8* %ptr, i32 %unknown) {
96 entry:
97   %conv = sext i32 %unknown to i64
98   %tmp = tail call i64 @llvm.objectsize.i64(i8* %ptr, i1 false)
99   %call = tail call i8* @__memset_chk(i8* %ptr, i32 1, i64 %conv, i64 %tmp)
100   ret void
101 }