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