diff options
| author | Kostya Kortchinsky <kostyak@google.com> | 2019-07-24 16:36:01 +0000 |
|---|---|---|
| committer | Kostya Kortchinsky <kostyak@google.com> | 2019-07-24 16:36:01 +0000 |
| commit | 419f1a4185d551594dc453b258bc4b8417edcfeb (patch) | |
| tree | e32f5e62345e8fc17de2e9b45be44a70c57014c6 /compiler-rt/lib/scudo/standalone/fuchsia.cc | |
| parent | 5cdacea29719082c4c9ec7c543486c4f81c25bd4 (diff) | |
| download | bcm5719-llvm-419f1a4185d551594dc453b258bc4b8417edcfeb.tar.gz bcm5719-llvm-419f1a4185d551594dc453b258bc4b8417edcfeb.zip | |
[scudo][standalone] Optimization pass
Summary:
This introduces a bunch of small optimizations with the purpose of
making the fastpath tighter:
- tag more conditions as `LIKELY`/`UNLIKELY`: as a rule of thumb we
consider that every operation related to the secondary is unlikely
- attempt to reduce the number of potentially extraneous instructions
- reorganize the `Chunk` header to not straddle a word boundary and
use more appropriate types
Note that some `LIKELY`/`UNLIKELY` impact might be less obvious as
they are in slow paths (for example in `secondary.cc`), but at this
point I am throwing a pretty wide net, and it's consistant and doesn't
hurt.
This was mosly done for the benfit of Android, but other platforms
benefit from it too. An aarch64 Android benchmark gives:
- before:
```
BM_youtube/min_time:15.000/repeats:4/manual_time_mean 445244 us 659385 us 4
BM_youtube/min_time:15.000/repeats:4/manual_time_median 445007 us 658970 us 4
BM_youtube/min_time:15.000/repeats:4/manual_time_stddev 885 us 1332 us 4
```
- after:
```
BM_youtube/min_time:15.000/repeats:4/manual_time_mean 415697 us 621925 us 4
BM_youtube/min_time:15.000/repeats:4/manual_time_median 415913 us 622061 us 4
BM_youtube/min_time:15.000/repeats:4/manual_time_stddev 990 us 1163 us 4
```
Additional since `-Werror=conversion` is enabled on some platforms we
are built on, enable it upstream to catch things early: a few sign
conversions had slept through and needed additional casting.
Reviewers: hctim, morehouse, eugenis, vitalybuka
Reviewed By: vitalybuka
Subscribers: srhines, mgorny, javed.absar, kristof.beyls, delcypher, #sanitizers, llvm-commits
Tags: #llvm, #sanitizers
Differential Revision: https://reviews.llvm.org/D64664
llvm-svn: 366918
Diffstat (limited to 'compiler-rt/lib/scudo/standalone/fuchsia.cc')
| -rw-r--r-- | compiler-rt/lib/scudo/standalone/fuchsia.cc | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/compiler-rt/lib/scudo/standalone/fuchsia.cc b/compiler-rt/lib/scudo/standalone/fuchsia.cc index 896d346e7e7..7e6c45182b1 100644 --- a/compiler-rt/lib/scudo/standalone/fuchsia.cc +++ b/compiler-rt/lib/scudo/standalone/fuchsia.cc @@ -40,7 +40,7 @@ static void *allocateVmar(uptr Size, MapPlatformData *Data, bool AllowNoMem) { _zx_vmar_root_self(), ZX_VM_CAN_MAP_READ | ZX_VM_CAN_MAP_WRITE | ZX_VM_CAN_MAP_SPECIFIC, 0, Size, &Data->Vmar, &Data->VmarBase); - if (Status != ZX_OK) { + if (UNLIKELY(Status != ZX_OK)) { if (Status != ZX_ERR_NO_MEMORY || !AllowNoMem) dieOnMapUnmapError(Status == ZX_ERR_NO_MEMORY); return nullptr; @@ -78,7 +78,7 @@ void *map(void *Addr, uptr Size, const char *Name, uptr Flags, } else { // Otherwise, create a Vmo and set its name. Status = _zx_vmo_create(Size, ZX_VMO_RESIZABLE, &Vmo); - if (Status != ZX_OK) { + if (UNLIKELY(Status != ZX_OK)) { if (Status != ZX_ERR_NO_MEMORY || !AllowNoMem) dieOnMapUnmapError(Status == ZX_ERR_NO_MEMORY); return nullptr; @@ -102,7 +102,7 @@ void *map(void *Addr, uptr Size, const char *Name, uptr Flags, } else { CHECK_EQ(_zx_handle_close(Vmo), ZX_OK); } - if (Status != ZX_OK) { + if (UNLIKELY(Status != ZX_OK)) { if (Status != ZX_ERR_NO_MEMORY || !AllowNoMem) dieOnMapUnmapError(Status == ZX_ERR_NO_MEMORY); return nullptr; @@ -125,7 +125,7 @@ void unmap(void *Addr, uptr Size, uptr Flags, MapPlatformData *Data) { const zx_handle_t Vmar = Data ? Data->Vmar : _zx_vmar_root_self(); const zx_status_t Status = _zx_vmar_unmap(Vmar, reinterpret_cast<uintptr_t>(Addr), Size); - if (Status != ZX_OK) + if (UNLIKELY(Status != ZX_OK)) dieOnMapUnmapError(); } if (Data) { @@ -172,7 +172,7 @@ u32 getNumberOfCPUs() { return _zx_system_get_num_cpus(); } bool getRandom(void *Buffer, uptr Length, bool Blocking) { COMPILER_CHECK(MaxRandomLength <= ZX_CPRNG_DRAW_MAX_LEN); - if (!Buffer || !Length || Length > MaxRandomLength) + if (UNLIKELY(!Buffer || !Length || Length > MaxRandomLength)) return false; _zx_cprng_draw(Buffer, Length); return true; |

