| Jessica Paquette | f90edbe | 2018-07-27 20:18:27 +0000 | [diff] [blame] | 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 - | \ |
| Evandro Menezes | f842534 | 2018-05-29 15:58:50 +0000 | [diff] [blame] | 4 | ; RUN: FileCheck --check-prefixes=CHECK,CHECK-LINUX %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 |
| Evandro Menezes | f842534 | 2018-05-29 15:58:50 +0000 | [diff] [blame] | 11 | define void @fct1(i8* nocapture %ptr) minsize { |
| Tim Northover | 00ed996 | 2014-03-29 10:18:08 +0000 | [diff] [blame] | 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 |
| Evandro Menezes | f842534 | 2018-05-29 15:58:50 +0000 | [diff] [blame] | 23 | define void @fct2(i8* nocapture %ptr) minsize { |
| Tim Northover | 00ed996 | 2014-03-29 10:18:08 +0000 | [diff] [blame] | 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 |
| Evandro Menezes | f842534 | 2018-05-29 15:58:50 +0000 | [diff] [blame] | 33 | define void @fct3(i8* nocapture %ptr, i32 %unknown) minsize { |
| Tim Northover | 00ed996 | 2014-03-29 10:18:08 +0000 | [diff] [blame] | 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 |
| Evandro Menezes | f842534 | 2018-05-29 15:58:50 +0000 | [diff] [blame] | 44 | define void @fct4(i8* %ptr) minsize { |
| Tim Northover | 00ed996 | 2014-03-29 10:18:08 +0000 | [diff] [blame] | 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 |
| Evandro Menezes | f842534 | 2018-05-29 15:58:50 +0000 | [diff] [blame] | 59 | define void @fct5(i8* %ptr) minsize { |
| Tim Northover | 00ed996 | 2014-03-29 10:18:08 +0000 | [diff] [blame] | 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 |
| Evandro Menezes | f842534 | 2018-05-29 15:58:50 +0000 | [diff] [blame] | 70 | define void @fct6(i8* %ptr, i32 %unknown) minsize { |
| Tim Northover | 00ed996 | 2014-03-29 10:18:08 +0000 | [diff] [blame] | 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 |
| Evandro Menezes | f842534 | 2018-05-29 15:58:50 +0000 | [diff] [blame] | 85 | define void @fct7(i8* %ptr) minsize { |
| Tim Northover | 00ed996 | 2014-03-29 10:18:08 +0000 | [diff] [blame] | 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 |
| Evandro Menezes | f842534 | 2018-05-29 15:58:50 +0000 | [diff] [blame] | 96 | define void @fct8(i8* %ptr) minsize { |
| Tim Northover | 00ed996 | 2014-03-29 10:18:08 +0000 | [diff] [blame] | 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 |
| Evandro Menezes | f842534 | 2018-05-29 15:58:50 +0000 | [diff] [blame] | 107 | define void @fct9(i8* %ptr, i32 %unknown) minsize { |
| Tim Northover | 00ed996 | 2014-03-29 10:18:08 +0000 | [diff] [blame] | 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 | } |