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