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