blob: ab819a42729acc9261d8ab81a24b31c9d0ae4bae [file] [log] [blame]
Jessica Paquettef90edbe2018-07-27 20:18:27 +00001; 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 - | \
Evandro Menezesf8425342018-05-29 15:58:50 +00004; RUN: FileCheck --check-prefixes=CHECK,CHECK-LINUX %s
Tim Northover00ed9962014-03-29 10:18:08 +00005; <rdar://problem/14199482> ARM64: Calls to bzero() replaced with calls to memset()
6
Matthias Braune29c0b82017-12-19 00:43:00 +00007; CHECK-LABEL: fct1:
Tim Northover00ed9962014-03-29 10:18:08 +00008; For small size (<= 256), we do not change memset to bzero.
Matthias Braune29c0b82017-12-19 00:43:00 +00009; CHECK-DARWIN: {{b|bl}} _memset
10; CHECK-LINUX: {{b|bl}} memset
Evandro Menezesf8425342018-05-29 15:58:50 +000011define void @fct1(i8* nocapture %ptr) minsize {
Tim Northover00ed9962014-03-29 10:18:08 +000012entry:
Daniel Neilson1e687242018-01-19 17:13:12 +000013 tail call void @llvm.memset.p0i8.i64(i8* %ptr, i8 0, i64 256, i1 false)
Tim Northover00ed9962014-03-29 10:18:08 +000014 ret void
15}
16
Daniel Neilson1e687242018-01-19 17:13:12 +000017declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i1)
Tim Northover00ed9962014-03-29 10:18:08 +000018
Matthias Braune29c0b82017-12-19 00:43:00 +000019; CHECK-LABEL: fct2:
Tim Northover00ed9962014-03-29 10:18:08 +000020; When the size is bigger than 256, change into bzero.
Matthias Braune29c0b82017-12-19 00:43:00 +000021; CHECK-DARWIN: {{b|bl}} _bzero
22; CHECK-LINUX: {{b|bl}} memset
Evandro Menezesf8425342018-05-29 15:58:50 +000023define void @fct2(i8* nocapture %ptr) minsize {
Tim Northover00ed9962014-03-29 10:18:08 +000024entry:
Daniel Neilson1e687242018-01-19 17:13:12 +000025 tail call void @llvm.memset.p0i8.i64(i8* %ptr, i8 0, i64 257, i1 false)
Tim Northover00ed9962014-03-29 10:18:08 +000026 ret void
27}
28
Matthias Braune29c0b82017-12-19 00:43:00 +000029; CHECK-LABEL: fct3:
Tim Northover00ed9962014-03-29 10:18:08 +000030; For unknown size, change to bzero.
Matthias Braune29c0b82017-12-19 00:43:00 +000031; CHECK-DARWIN: {{b|bl}} _bzero
32; CHECK-LINUX: {{b|bl}} memset
Evandro Menezesf8425342018-05-29 15:58:50 +000033define void @fct3(i8* nocapture %ptr, i32 %unknown) minsize {
Tim Northover00ed9962014-03-29 10:18:08 +000034entry:
35 %conv = sext i32 %unknown to i64
Daniel Neilson1e687242018-01-19 17:13:12 +000036 tail call void @llvm.memset.p0i8.i64(i8* %ptr, i8 0, i64 %conv, i1 false)
Tim Northover00ed9962014-03-29 10:18:08 +000037 ret void
38}
39
Matthias Braune29c0b82017-12-19 00:43:00 +000040; CHECK-LABEL: fct4:
Tim Northover00ed9962014-03-29 10:18:08 +000041; Size <= 256, no change.
Matthias Braune29c0b82017-12-19 00:43:00 +000042; CHECK-DARWIN: {{b|bl}} _memset
43; CHECK-LINUX: {{b|bl}} memset
Evandro Menezesf8425342018-05-29 15:58:50 +000044define void @fct4(i8* %ptr) minsize {
Tim Northover00ed9962014-03-29 10:18:08 +000045entry:
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
Matthias Braune29c0b82017-12-19 00:43:00 +000055; CHECK-LABEL: fct5:
Tim Northover00ed9962014-03-29 10:18:08 +000056; Size > 256, change.
Matthias Braune29c0b82017-12-19 00:43:00 +000057; CHECK-DARWIN: {{b|bl}} _bzero
58; CHECK-LINUX: {{b|bl}} memset
Evandro Menezesf8425342018-05-29 15:58:50 +000059define void @fct5(i8* %ptr) minsize {
Tim Northover00ed9962014-03-29 10:18:08 +000060entry:
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
Matthias Braune29c0b82017-12-19 00:43:00 +000066; CHECK-LABEL: fct6:
Tim Northover00ed9962014-03-29 10:18:08 +000067; Size = unknown, change.
Matthias Braune29c0b82017-12-19 00:43:00 +000068; CHECK-DARWIN: {{b|bl}} _bzero
69; CHECK-LINUX: {{b|bl}} memset
Evandro Menezesf8425342018-05-29 15:58:50 +000070define void @fct6(i8* %ptr, i32 %unknown) minsize {
Tim Northover00ed9962014-03-29 10:18:08 +000071entry:
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
Matthias Braune29c0b82017-12-19 00:43:00 +000081; CHECK-LABEL: fct7:
Tim Northover00ed9962014-03-29 10:18:08 +000082; memset with something that is not a zero, no change.
Matthias Braune29c0b82017-12-19 00:43:00 +000083; CHECK-DARWIN: {{b|bl}} _memset
84; CHECK-LINUX: {{b|bl}} memset
Evandro Menezesf8425342018-05-29 15:58:50 +000085define void @fct7(i8* %ptr) minsize {
Tim Northover00ed9962014-03-29 10:18:08 +000086entry:
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
Matthias Braune29c0b82017-12-19 00:43:00 +000092; CHECK-LABEL: fct8:
Tim Northover00ed9962014-03-29 10:18:08 +000093; memset with something that is not a zero, no change.
Matthias Braune29c0b82017-12-19 00:43:00 +000094; CHECK-DARWIN: {{b|bl}} _memset
95; CHECK-LINUX: {{b|bl}} memset
Evandro Menezesf8425342018-05-29 15:58:50 +000096define void @fct8(i8* %ptr) minsize {
Tim Northover00ed9962014-03-29 10:18:08 +000097entry:
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
Matthias Braune29c0b82017-12-19 00:43:00 +0000103; CHECK-LABEL: fct9:
Tim Northover00ed9962014-03-29 10:18:08 +0000104; memset with something that is not a zero, no change.
Matthias Braune29c0b82017-12-19 00:43:00 +0000105; CHECK-DARWIN: {{b|bl}} _memset
106; CHECK-LINUX: {{b|bl}} memset
Evandro Menezesf8425342018-05-29 15:58:50 +0000107define void @fct9(i8* %ptr, i32 %unknown) minsize {
Tim Northover00ed9962014-03-29 10:18:08 +0000108entry:
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}