| Bradley Smith | 3567cc1 | 2014-05-01 13:11:59 +0000 | [diff] [blame] | 1 | ; RUN: llc %s -mtriple=arm64-apple-darwin -o - | \ | 
|  | 2 | ; RUN:   FileCheck --check-prefix=CHECK-DARWIN --check-prefix=CHECK %s | 
|  | 3 | ; RUN: llc %s -mtriple=arm64-linux-gnu -o - | \ | 
|  | 4 | ; RUN:   FileCheck --check-prefix=CHECK-LINUX --check-prefix=CHECK %s | 
| Tim Northover | 00ed996 | 2014-03-29 10:18:08 +0000 | [diff] [blame] | 5 | ; <rdar://problem/14199482> ARM64: Calls to bzero() replaced with calls to memset() | 
|  | 6 |  | 
| Matthias Braun | e29c0b8 | 2017-12-19 00:43:00 +0000 | [diff] [blame] | 7 | ; CHECK-LABEL: fct1: | 
| Tim Northover | 00ed996 | 2014-03-29 10:18:08 +0000 | [diff] [blame] | 8 | ; For small size (<= 256), we do not change memset to bzero. | 
| Matthias Braun | e29c0b8 | 2017-12-19 00:43:00 +0000 | [diff] [blame] | 9 | ; CHECK-DARWIN: {{b|bl}} _memset | 
|  | 10 | ; CHECK-LINUX: {{b|bl}} memset | 
| Tim Northover | 00ed996 | 2014-03-29 10:18:08 +0000 | [diff] [blame] | 11 | define void @fct1(i8* nocapture %ptr) { | 
|  | 12 | entry: | 
| Daniel Neilson | 1e68724 | 2018-01-19 17:13:12 +0000 | [diff] [blame^] | 13 | tail call void @llvm.memset.p0i8.i64(i8* %ptr, i8 0, i64 256, i1 false) | 
| Tim Northover | 00ed996 | 2014-03-29 10:18:08 +0000 | [diff] [blame] | 14 | ret void | 
|  | 15 | } | 
|  | 16 |  | 
| Daniel Neilson | 1e68724 | 2018-01-19 17:13:12 +0000 | [diff] [blame^] | 17 | declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i1) | 
| Tim Northover | 00ed996 | 2014-03-29 10:18:08 +0000 | [diff] [blame] | 18 |  | 
| Matthias Braun | e29c0b8 | 2017-12-19 00:43:00 +0000 | [diff] [blame] | 19 | ; CHECK-LABEL: fct2: | 
| Tim Northover | 00ed996 | 2014-03-29 10:18:08 +0000 | [diff] [blame] | 20 | ; When the size is bigger than 256, change into bzero. | 
| Matthias Braun | e29c0b8 | 2017-12-19 00:43:00 +0000 | [diff] [blame] | 21 | ; CHECK-DARWIN: {{b|bl}} _bzero | 
|  | 22 | ; CHECK-LINUX: {{b|bl}} memset | 
| Tim Northover | 00ed996 | 2014-03-29 10:18:08 +0000 | [diff] [blame] | 23 | define void @fct2(i8* nocapture %ptr) { | 
|  | 24 | entry: | 
| Daniel Neilson | 1e68724 | 2018-01-19 17:13:12 +0000 | [diff] [blame^] | 25 | tail call void @llvm.memset.p0i8.i64(i8* %ptr, i8 0, i64 257, i1 false) | 
| Tim Northover | 00ed996 | 2014-03-29 10:18:08 +0000 | [diff] [blame] | 26 | ret void | 
|  | 27 | } | 
|  | 28 |  | 
| Matthias Braun | e29c0b8 | 2017-12-19 00:43:00 +0000 | [diff] [blame] | 29 | ; CHECK-LABEL: fct3: | 
| Tim Northover | 00ed996 | 2014-03-29 10:18:08 +0000 | [diff] [blame] | 30 | ; For unknown size, change to bzero. | 
| Matthias Braun | e29c0b8 | 2017-12-19 00:43:00 +0000 | [diff] [blame] | 31 | ; CHECK-DARWIN: {{b|bl}} _bzero | 
|  | 32 | ; CHECK-LINUX: {{b|bl}} memset | 
| Tim Northover | 00ed996 | 2014-03-29 10:18:08 +0000 | [diff] [blame] | 33 | define void @fct3(i8* nocapture %ptr, i32 %unknown) { | 
|  | 34 | entry: | 
|  | 35 | %conv = sext i32 %unknown to i64 | 
| Daniel Neilson | 1e68724 | 2018-01-19 17:13:12 +0000 | [diff] [blame^] | 36 | tail call void @llvm.memset.p0i8.i64(i8* %ptr, i8 0, i64 %conv, i1 false) | 
| Tim Northover | 00ed996 | 2014-03-29 10:18:08 +0000 | [diff] [blame] | 37 | ret void | 
|  | 38 | } | 
|  | 39 |  | 
| Matthias Braun | e29c0b8 | 2017-12-19 00:43:00 +0000 | [diff] [blame] | 40 | ; CHECK-LABEL: fct4: | 
| Tim Northover | 00ed996 | 2014-03-29 10:18:08 +0000 | [diff] [blame] | 41 | ; Size <= 256, no change. | 
| Matthias Braun | e29c0b8 | 2017-12-19 00:43:00 +0000 | [diff] [blame] | 42 | ; CHECK-DARWIN: {{b|bl}} _memset | 
|  | 43 | ; CHECK-LINUX: {{b|bl}} memset | 
| Tim Northover | 00ed996 | 2014-03-29 10:18:08 +0000 | [diff] [blame] | 44 | define void @fct4(i8* %ptr) { | 
|  | 45 | entry: | 
|  | 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 |  | 
|  | 51 | declare i8* @__memset_chk(i8*, i32, i64, i64) | 
|  | 52 |  | 
|  | 53 | declare i64 @llvm.objectsize.i64(i8*, i1) | 
|  | 54 |  | 
| Matthias Braun | e29c0b8 | 2017-12-19 00:43:00 +0000 | [diff] [blame] | 55 | ; CHECK-LABEL: fct5: | 
| Tim Northover | 00ed996 | 2014-03-29 10:18:08 +0000 | [diff] [blame] | 56 | ; Size > 256, change. | 
| Matthias Braun | e29c0b8 | 2017-12-19 00:43:00 +0000 | [diff] [blame] | 57 | ; CHECK-DARWIN: {{b|bl}} _bzero | 
|  | 58 | ; CHECK-LINUX: {{b|bl}} memset | 
| Tim Northover | 00ed996 | 2014-03-29 10:18:08 +0000 | [diff] [blame] | 59 | define void @fct5(i8* %ptr) { | 
|  | 60 | entry: | 
|  | 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 Braun | e29c0b8 | 2017-12-19 00:43:00 +0000 | [diff] [blame] | 66 | ; CHECK-LABEL: fct6: | 
| Tim Northover | 00ed996 | 2014-03-29 10:18:08 +0000 | [diff] [blame] | 67 | ; Size = unknown, change. | 
| Matthias Braun | e29c0b8 | 2017-12-19 00:43:00 +0000 | [diff] [blame] | 68 | ; CHECK-DARWIN: {{b|bl}} _bzero | 
|  | 69 | ; CHECK-LINUX: {{b|bl}} memset | 
| Tim Northover | 00ed996 | 2014-03-29 10:18:08 +0000 | [diff] [blame] | 70 | define void @fct6(i8* %ptr, i32 %unknown) { | 
|  | 71 | entry: | 
|  | 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 Braun | e29c0b8 | 2017-12-19 00:43:00 +0000 | [diff] [blame] | 81 | ; CHECK-LABEL: fct7: | 
| Tim Northover | 00ed996 | 2014-03-29 10:18:08 +0000 | [diff] [blame] | 82 | ; memset with something that is not a zero, no change. | 
| Matthias Braun | e29c0b8 | 2017-12-19 00:43:00 +0000 | [diff] [blame] | 83 | ; CHECK-DARWIN: {{b|bl}} _memset | 
|  | 84 | ; CHECK-LINUX: {{b|bl}} memset | 
| Tim Northover | 00ed996 | 2014-03-29 10:18:08 +0000 | [diff] [blame] | 85 | define void @fct7(i8* %ptr) { | 
|  | 86 | entry: | 
|  | 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 Braun | e29c0b8 | 2017-12-19 00:43:00 +0000 | [diff] [blame] | 92 | ; CHECK-LABEL: fct8: | 
| Tim Northover | 00ed996 | 2014-03-29 10:18:08 +0000 | [diff] [blame] | 93 | ; memset with something that is not a zero, no change. | 
| Matthias Braun | e29c0b8 | 2017-12-19 00:43:00 +0000 | [diff] [blame] | 94 | ; CHECK-DARWIN: {{b|bl}} _memset | 
|  | 95 | ; CHECK-LINUX: {{b|bl}} memset | 
| Tim Northover | 00ed996 | 2014-03-29 10:18:08 +0000 | [diff] [blame] | 96 | define void @fct8(i8* %ptr) { | 
|  | 97 | entry: | 
|  | 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 Braun | e29c0b8 | 2017-12-19 00:43:00 +0000 | [diff] [blame] | 103 | ; CHECK-LABEL: fct9: | 
| Tim Northover | 00ed996 | 2014-03-29 10:18:08 +0000 | [diff] [blame] | 104 | ; memset with something that is not a zero, no change. | 
| Matthias Braun | e29c0b8 | 2017-12-19 00:43:00 +0000 | [diff] [blame] | 105 | ; CHECK-DARWIN: {{b|bl}} _memset | 
|  | 106 | ; CHECK-LINUX: {{b|bl}} memset | 
| Tim Northover | 00ed996 | 2014-03-29 10:18:08 +0000 | [diff] [blame] | 107 | define void @fct9(i8* %ptr, i32 %unknown) { | 
|  | 108 | entry: | 
|  | 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 | } |