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